ABSTRACT:

Animal movements are often defined using the home range concept. Consequently, home ranges are determined by temporal, spatial, and individual-level processes. Within the environment, one of the key factors influencing an animal’s range and how it uses the environment is that of resources. Alterations to the environment that affect resource distribution and availability can have profound consequences on an animal’s spatial patterns. One of the best examples of this is that of golf courses. Some environmental modifications exhibited by some human altered environment can have positive effects on certain wildlife species by altering their movement patterns and foraging efforts. We analyzed data collected from 22 Gila Monsters Heloderma suspectum at a subsidized environment in Arizona from 2007 to 2013 and a non-subsidized environment. We performed both kernel density estimation and minimum convex polygons for comparability purposes. After adjusting for sex, number of fixes, and year, males in the subsidized environment had an average area of 15.9 ha while the females had an area of 5.9 ha. In the un-subsidized environment males had an average range of 38.8 ha while females had an area of 29.8 ha. This suggests that the home ranges may be smaller in subsidized environments than those of un-subsidized environments due to increases in available resources. There were also differences in home range overlap within and between sexes. In the subsidized population, there was very little male-male overlap with only two occurances, more female-female overlap and male-female overlap was increased. Male home ranges often overlapped several female home ranges. Gila Monsters may not have to invest in wide ranging foraging efforts as those populations of the un-subsidized environments.

Overview of the spatial ecology of Gila Monsters (Heloderma suspectum) at Stone Canyon Golf Club as a resource subsidized population vs. Owl Head Buttes representing the unsubsized natural population. Compared home range sizes of Heloderma suspectum between two populations. One represented a subsidized population at Stone Canyon Golf Club and the other at Owl Head Buttes representing the unsubsidized population. Stone Canyon is located in Oro Valley on the north end of Tucson, Arizona. Owl Head Buttes is located about 17 km straight line distance north west from Stone Canyon. Data at Owl Head was collected from 2000 - 2002, while fixes were collected from 2007 - 2013 at Stone Canyon. We Calculated minimum convex polygons using both 95 percent and 100 percent of the locations for each lizard, as well as 95% and 50% Kernel Density Estimations (KDE).

Figure 1 | Stone Canyon Golf Club, located in Oro Valley, Arizona on the northern edge of Tucson.

Overall Yearly Home Ranges (MCP)

Summary of home range size.

Table 1 | Pooled overall home ranges of Gila Monsters at Owl Head Buttes and Stone Canyon Golf Club. Both 100% and 95% MCPs were calculated between both populations.



Table: Home range sizes of Stone Canyon and Owl head Buttes using both 95 percent and 100 percent MCPs.

Year   Gila   Sex      Environment      Home_Range_100mcp   N100   Home_Range_95mcp   N95
-----  -----  -------  --------------  ------------------  -----  -----------------  ----
2000   1      female   nonsubsidized                25.20     42              23.00    38
_      2      male     nonsubsidized                28.70    125              24.50   112
_      3      male     nonsubsidized                82.70     89              68.40    78
_      4      male     nonsubsidized                55.60     80              40.50    73
2001   1      female   nonsubsidized                20.10     26                 NA    NA
_      2      male     nonsubsidized                23.50     10                 NA    NA
_      3      male     nonsubsidized                60.10     18                 NA    NA
_      4      male     nonsubsidized                24.40     21                 NA    NA
_      10     male     nonsubsidized                28.50     14                 NA    NA
_      11     male     nonsubsidized                10.60     22                 NA    NA
_      12     male     nonsubsidized                23.60      7                 NA    NA
_      13     female   nonsubsidized                 8.90      9                 NA    NA
_      15     female   nonsubsidized                13.00     11                 NA    NA
_      50     female   nonsubsidized                21.00     11                 NA    NA
_      51     female   nonsubsidized                 7.10      8                 NA    NA
2002   2      male     nonsubsidized                66.20     38              40.00    37
_      4      male     nonsubsidized                73.10     76              55.50    73
_      10     male     nonsubsidized                39.50    111              33.30   105
_      11     male     nonsubsidized                39.30     92              31.90    88
_      12     male     nonsubsidized                49.50     66              41.50    63
_      13     female   nonsubsidized                26.30    101              23.70    96
_      15     female   nonsubsidized                39.20     98              21.30    94
_      17     female   nonsubsidized                47.60    106              29.10   101
_      50     female   nonsubsidized                15.80     68              14.10    66
_      51     female   nonsubsidized                18.50     57              12.40    57
2007   F104   female   subsidized                    3.37     18               3.37    19
_      F114   female   subsidized                    2.51      8               0.58     7
_      F36    female   subsidized                    5.05     20               3.49    19
_      F66    female   subsidized                   10.23     22               5.56    20
_      M112   male     subsidized                   12.51     13              12.51    12
_      M14    male     subsidized                    4.66     15               3.87    14
2008   F104   female   subsidized                    4.97     53               3.47    50
_      F114   female   subsidized                   11.96     52               9.38    49
_      F135   female   subsidized                    4.07     16               1.58    15
_      F137   female   subsidized                    5.98     15               5.75    14
_      F36    female   subsidized                    9.73     54               7.55    51
_      F66    female   subsidized                   11.29     51               9.95    48
_      M119   male     subsidized                   25.01     58              20.23    55
2009   F104   female   subsidized                    7.45     64               7.25    62
_      F114   female   subsidized                   11.46     52               8.28    49
_      F135   female   subsidized                    6.21     62               5.47    58
_      F137   female   subsidized                    6.09     35               5.68    33
_      F147   female   subsidized                   17.90     50              14.04    48
_      F36    female   subsidized                    7.48     62               5.83    60
_      F66    female   subsidized                   12.20     67              11.01    66
_      M112   female   subsidized                    7.89     71               1.73    70
_      M119   male     subsidized                   22.62     18              16.37    16
_      M69    male     subsidized                    1.91     69               1.91    69
_      F146   male     subsidized                   10.01     20               8.49    17
2010   F114   female   subsidized                    9.65     44               8.30    41
_      F137   female   subsidized                    6.32     45               5.26    42
_      F147   female   subsidized                   16.65     36              14.75    34
_      F200   female   subsidized                    5.36     34               5.23    33
_      F214   female   subsidized                    7.38     27               3.01    25
_      F36    female   subsidized                   38.81     50              12.16    47
_      F66    female   subsidized                   28.96     52              16.22    49
_      M112   male     subsidized                   20.46     26              14.41    24
_      M119   male     subsidized                   17.46     31               9.70    29
_      M69    male     subsidized                   13.85     30              10.75    28
2011   F114   female   subsidized                    5.91     22               3.30    20
_      F137   female   subsidized                    4.80     33               4.28    31
_      F147   female   subsidized                   19.44     24              12.90    22
_      F200   female   subsidized                    8.35     28               7.66    27
_      F214   female   subsidized                    6.61     22               5.66    21
_      F252   female   subsidized                    3.09     17               1.60    16
_      F36    female   subsidized                   11.93     23              10.95    21
_      F66    female   subsidized                    5.72      5               0.66     4
_      M14    male     subsidized                    4.48     13               3.84    12
_      M215   male     subsidized                   11.47     16              11.47    15
_      M255   male     subsidized                    5.85     16               5.59    15
2012   F114   female   subsidized                   10.17     54               7.15    51
_      F137   female   subsidized                    2.06     13               1.36    12
_      F147   female   subsidized                   17.64     52              16.75    49
_      F252   female   subsidized                    5.19     53               3.63    50
_      F36    female   subsidized                   10.34     52              10.30    49
_      M14    male     subsidized                    4.42     13               3.77    12
_      M215   male     subsidized                   11.04     21               9.85    20
_      M255   male     subsidized                    8.21     13               5.39    12
2013   F114   female   subsidized                    1.16      7               0.28     6
_      F147   female   subsidized                    0.31      6               0.00     5
_      F252   female   subsidized                      NA      4                 NA    NA
_      F36    female   subsidized                    0.13      6               0.00     5

Gila Monster Home Range Sizes at Stone Canyon vs. Owl Head Buttes.

Table 2 | Group 100% MCP home range means of raw data of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.



Table: Group Means of Overall 100% MCP Home Ranges

Environment     Sex        N   Home_Range_100mcp          sd         se          ci
--------------  -------  ---  ------------------  ----------  ---------  ----------
nonsubsidized   female    11           22.063636   12.287414   3.704795    8.254797
nonsubsidized   male      14           43.235714   21.672372   5.792185   12.513255
subsidized      female    37            9.836757    6.984007   1.148164    2.328584
subsidized      male      17           11.825294    6.706133   1.626476    3.447976

Table 3 | Group 95% MCP home range means of raw data of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.



Table: Group Means of Overall 95% MCP Home
      Ranges

Environment     Sex        N   Home_Range_95mcp          sd          se          ci
--------------  -------  ---  -----------------  ----------  ----------  ----------
nonsubsidized   female     6          20.600000    6.286493   2.5664502    6.597270
nonsubsidized   male       8          41.950000   13.987954   4.9454886   11.694222
subsidized      female    37           7.132432    4.339651   0.7134342    1.446912
subsidized      male      17           9.037059    4.934157   1.1967090    2.536910

Gila Monster Yearly Home Range Shifts of 100% MCPs.

Repeated measures ANOVA for Yearly Home Ranges.

Repeated Measure ANOVA for 100% MCP overall home ranges

Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Home_Range_100mcp ~ Environment + Year + Sex + N100 + Environment *  
    Sex + (1 | Gila)
   Data: year

REML criterion at convergence: 573.4

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-2.75980 -0.39242 -0.05151  0.28203  3.07570 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept) 29.62    5.443   
 Residual             82.78    9.098   
Number of obs: 79, groups:  Gila, 30

Fixed effects:
                                Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                   -1.072e+03  1.679e+03  7.165e+01  -0.638 0.525333    
Environmentsubsidized         -1.542e+01  8.207e+00  6.638e+01  -1.880 0.064559 .  
Year                           5.419e-01  8.389e-01  7.165e+01   0.646 0.520346    
Sexmale                        1.967e+01  4.862e+00  2.518e+01   4.046 0.000435 ***
N100                           1.917e-01  4.144e-02  5.484e+01   4.625 2.33e-05 ***
Environmentsubsidized:Sexmale -1.484e+01  6.081e+00  2.719e+01  -2.441 0.021450 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Envrnm Year   Sexmal N100  
Envrnmntsbs  0.855                            
Year        -1.000 -0.856                     
Sexmale     -0.043  0.278  0.041              
N100         0.060  0.121 -0.062 -0.041       
Envrnmnts:S  0.012 -0.332 -0.011 -0.801  0.101

ANOVA Table: 100% MCP

Type III Analysis of Variance Table with Satterthwaite's method
                 Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment      719.49  719.49     1 71.576  8.6920 0.0043136 ** 
Year              34.54   34.54     1 71.651  0.4173 0.5203462    
Sex             1351.82 1351.82     1 26.188 16.3309 0.0004154 ***
N100            1770.69 1770.69     1 54.843 21.3913 2.325e-05 ***
Environment:Sex  493.10  493.10     1 27.186  5.9570 0.0214502 *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Repeated Measure ANOVA for 95% MCP overall home ranges

Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Home_Range_95mcp ~ Environment + Year + Sex + N100 + Environment *  
    Sex + (1 | Gila)
   Data: year

REML criterion at convergence: 416.1

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.5866 -0.3142 -0.0239  0.2939  2.1056 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept) 42.58    6.525   
 Residual             14.24    3.774   
Number of obs: 68, groups:  Gila, 30

Fixed effects:
                                Estimate Std. Error         df t value Pr(>|t|)    
(Intercept)                   -868.75075  808.91445   39.02219  -1.074 0.289432    
Environmentsubsidized          -17.87976    5.09289   57.98897  -3.511 0.000872 ***
Year                             0.44337    0.40411   39.02461   1.097 0.279296    
Sexmale                         21.82943    4.31027   25.65769   5.065 2.94e-05 ***
N100                             0.02367    0.03032   40.40428   0.781 0.439569    
Environmentsubsidized:Sexmale  -16.25133    4.97477   32.87969  -3.267 0.002548 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Envrnm Year   Sexmal N100  
Envrnmntsbs  0.643                            
Year        -1.000 -0.647                     
Sexmale     -0.035  0.396  0.033              
N100        -0.006  0.276  0.003 -0.051       
Envrnmnts:S -0.002 -0.460  0.004 -0.865  0.044

ANOVA Table: 95% MCP

Type III Analysis of Variance Table with Satterthwaite's method
                Sum Sq Mean Sq NumDF  DenDF F value   Pr(>F)    
Environment     470.59  470.59     1 61.980 33.0376 2.96e-07 ***
Year             17.15   17.15     1 39.025  1.2038 0.279296    
Sex             430.74  430.74     1 32.267 30.2402 4.53e-06 ***
N100              8.68    8.68     1 40.404  0.6094 0.439569    
Environment:Sex 152.01  152.01     1 32.880 10.6717 0.002548 ** 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Table 4. Directional means of home range after being adjusted for year, sex and sample size.



Table: Adjusted Group Means of Overall Home   Ranges

Environment     Sex          lsmean         SE         df    lower.CL   upper.CL
--------------  -------  ----------  ---------  ---------  ----------  ---------
nonsubsidized   female    23.739759   6.015077   66.85165   11.733125   35.74639
subsidized      female     8.314934   3.281775   46.24553    1.710009   14.91986
nonsubsidized   male      43.412310   6.061028   66.27236   31.312006   55.51261
subsidized      male      13.146356   3.754579   53.70952    5.617946   20.67477

Post-Hoc comparisons between sexes and environment:

$emmeans
Environment = nonsubsidized:
 Sex    emmean   SE   df lower.CL upper.CL
 female  23.74 6.02 66.8    11.73     35.7
 male    43.41 6.06 66.3    31.31     55.5

Environment = subsidized:
 Sex    emmean   SE   df lower.CL upper.CL
 female   8.31 3.28 46.2     1.71     14.9
 male    13.15 3.75 53.7     5.62     20.7

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Environment = nonsubsidized:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -19.67 4.87 31.6 -4.041  0.0003 

Environment = subsidized:
 contrast      estimate   SE   df t.ratio p.value
 female - male    -4.83 3.71 36.4 -1.301  0.2014 

Graphical Comparisons of Sex Within Each Environment:

Figure 6 | Pairwise comparisons of home range between sexes within each environment. If red arrows overlap those of others, then there is no significant statistical difference.

$emmeans
Sex = female:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  23.74 6.02 66.8    11.73     35.7
 subsidized      8.31 3.28 46.2     1.71     14.9

Sex = male:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  43.41 6.06 66.3    31.31     55.5
 subsidized     13.15 3.75 53.7     5.62     20.7

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Sex = female:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     15.4 8.36 68.3 1.845   0.0694 

Sex = male:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized     30.3 8.60 69.4 3.517   0.0008 

Graphical Comparisons of Sex between the two populations:

Figure 7 | Paiwise comparisons of sex between environments. If red arrows overlap those of others, then there is no significant statistical difference.

At Stone Canyon, male yearly home ranges ranged from 1.91 - 25.1 ha, with a mean of 11.7 ± 1.7 S.E. ha (100% MCP), 9.1 ± 1.3 S.E. Ha (95% MCP). Female home ranges ranged from 2.06 – 38.81 ha and a mean of 9.8 ± 1.1 S.E. ha (100% MCP), 7.1 ± 0.71 S.E. ha (95% MCP). Male Gila Monsters at Owl head Buttes had home ranges that ranged from 10.6 – 82.7 ha with a mean of 43.2 ± 5.7 S.E. ha (100% MCP), 41.9 ± 4.9 S.E. ha (95% MCP). Female home ranges ranged from 7.1 – 47.6 with a mean of 22.0 ± 3.7 S.E. ha (100% MCP), 20.6 ± 2.5 S.E. ha (95% MCP). In the analyses of both populations, year had no effect on home range sizes (F = 0.50, P = 0.48), while there was a detected significant difference in home ranges between the two populations (F = 8.86, P = 0.003), as well as sex (F = 15.75, P = 0.0004). Post-Hoc analyses between sexes indicated that there was a significant difference in male home ranges between the two environments (df = 70.4, P = 0.0007). There was a slight difference of female home ranges between the two environments, however it was not statistically significant (df = 68.9, P = 0.06). At stone canyon there was no major difference between male and female home ranges (df = 36.9, P = 0.23) with male home range being only 3% larger than females. Males at Owl Head Buttes had a 65% larger home range than did females, and was statistically significant (df = 31.3, P = 0.0003). Interestingly, males at Stone Canyon had smaller home ranges than did the females at Owl Head Buttes (Table x) When using 95% MCPs, male home ranges reduced by 25% and female range by 31%. At Owl Head Buttes, Gila Monsters showed a similar behavior with male home ranges reduced by 20% and female ranges reduced by 26% using 95% MCPs.

Overall Yearly Home Ranges (KDE)

Home range estimation on the Stone Canyon Gila Monsters using 95% KDEs with href bandwidth produced male home ranges ranging from 14.52 – 55.25 ha with a mean of 33.9 ± 3.27 S.E. ha. Female home ranges ranged from 10.09 – 47.77 ha with a mean of 23.06 ± 1.86 S.E. KDE estimates for male and female home ranges were 96% and 80% larger than MCP estimates. Repeated Measures analysis of KDEs suggested that there was a small significant difference between male and female home ranges at Stone Canyon (F = 4.52, P = 0.04). Year did not have an effect on home ranges (F = 0.67, P = 0.41).



Table: Yearly KDE Home Ranges

 Year  Gila   Sex      Environment    Home_Range_95kde    N   Home_Range_50kde   N50
-----  -----  -------  ------------  -----------------  ---  -----------------  ----
 2007  F104   female   subsidized                13.84   18               3.69    15
   NA  F36    female   subsidized                16.51   20               4.26    16
   NA  F66    female   subsidized                32.31   22               7.86    17
   NA  M67    male     subsidized                   NA   16               8.97    12
   NA  M112   male     subsidized                   NA   13              15.42    11
   NA  M14    male     subsidized                14.52   15               3.76    12
   NA  M67    male     subsidized                35.47   14               8.97    10
 2008  F104   female   subsidized                13.22   53               2.61    42
   NA  F114   female   subsidized                20.55   52               3.68    38
   NA  F135   female   subsidized                11.36   16               2.19    12
   NA  F137   female   subsidized                20.51   15               5.61    14
   NA  F36    female   subsidized                18.89   54               4.98    41
   NA  F66    female   subsidized                39.30   50               9.97    43
   NA  M119   male     subsidized                47.65   58              12.18    43
 2009  F104   female   subsidized                19.11   64               4.63    14
   NA  F114   female   subsidized                20.34   52               4.08    43
   NA  F135   female   subsidized                14.43   62               4.43    50
   NA  F137   female   subsidized                16.94   35               4.99    32
   NA  F147   female   subsidized                39.67   62               9.06    52
   NA  F36    female   subsidized                13.96   67               3.20    52
   NA  F66    female   subsidized                25.90   71               6.35    69
   NA  M112   female   subsidized                   NA   18              14.27    17
   NA  M119   male     subsidized                49.53   69              12.55    61
   NA  M69    male     subsidized                   NA   NA                 NA    NA
   NA  F146   male     subsidized                20.17   43               3.97    31
 2010  F114   female   subsidized                21.06   44               6.08    35
   NA  F137   female   subsidized                13.24   45               3.33    13
   NA  F147   female   subsidized                34.73   36               7.13    28
   NA  F200   female   subsidized                20.37   34               4.09    25
   NA  F214   female   subsidized                14.97   27               3.56    24
   NA  F36    female   subsidized                47.49   50               9.73    37
   NA  F66    female   subsidized                47.77   52               7.26    33
   NA  M112   male     subsidized                55.25   26               8.60    21
   NA  M119   male     subsidized                33.88   31               7.14    22
   NA  M69    male     subsidized                37.45   30              10.49    22
   NA  F146   female   subsidized                33.84    9               8.39     7
 2011  F114   female   subsidized                13.82   22               2.66    17
   NA  F137   female   subsidized                12.12   33               2.65    25
   NA  F147   female   subsidized                43.80   24               9.66    17
   NA  F200   female   subsidized                23.96   28               6.86    26
   NA  F214   female   subsidized                23.39   22               5.91    18
   NA  F252   female   subsidized                 8.55   17               1.94    14
   NA  F36    female   subsidized                34.90   23               8.81    20
   NA  M14    male     subsidized                20.36   12               5.27    10
   NA  M215   male     subsidized                46.26   16              11.74    15
   NA  M255   male     subsidized                30.10   16               8.25    15
 2012  F114   female   subsidized                21.04   54               5.41    45
   NA  F137   female   subsidized                 7.87   13               1.24    10
   NA  F147   female   subsidized                32.98   52               7.74    36
   NA  F252   female   subsidized                10.09   53               1.83    39
   NA  F36    female   subsidized                27.59   52               7.67    39
   NA  M14    male     subsidized                24.02   13               6.49    10
   NA  M215   male     subsidized                28.52   21               7.31    15
   NA  M255   male     subsidized                32.03   13               8.27    11

Table | Raw Group 95% KDE home range means of Stone Canyon and Owl Head Buttes. Grouped by environment and sex.



Table: Raw Group Means of Overall 95% KDE Home
      Ranges

Sex        N   Home_Range_95kde         sd         se         ci
-------  ---  -----------------  ---------  ---------  ---------
female    36           23.06722   11.19254   1.865424   3.787012
male      14           33.94357   12.24405   3.272359   7.069503

Repeated measures ANOVA for KDE Home Ranges.

Repeated Measure ANOVA for 95% KDE overall home ranges

Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Home_Range_95kde ~ Year + Sex + N + (1 | Gila)
   Data: sub

REML criterion at convergence: 364.2

Scaled residuals: 
     Min       1Q   Median       3Q      Max 
-1.53251 -0.55223 -0.05156  0.30402  2.59672 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept) 76.00    8.718   
 Residual             64.47    8.030   
Number of obs: 50, groups:  Gila, 18

Fixed effects:
              Estimate Std. Error         df t value Pr(>|t|)  
(Intercept) -1.430e+03  1.764e+03  3.974e+01  -0.810   0.4225  
Year         7.226e-01  8.778e-01  3.975e+01   0.823   0.4153  
Sexmale      9.973e+00  4.689e+00  2.329e+01   2.127   0.0442 *
N            2.051e-02  7.616e-02  3.718e+01   0.269   0.7892  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
        (Intr) Year   Sexmal
Year    -1.000              
Sexmale -0.002  0.000       
N        0.004 -0.005  0.101

ANOVA Table for 95% KDE (subsidized)

Type III Analysis of Variance Table with Satterthwaite's method
      Sum Sq Mean Sq NumDF  DenDF F value  Pr(>F)  
Year  43.696  43.696     1 39.749  0.6777 0.41528  
Sex  291.640 291.640     1 23.292  4.5234 0.04424 *
N      4.673   4.673     1 37.176  0.0725 0.78924  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Table | Directional means of KDE home ranges after being adjusted for year, sex and sample size.



Table: Adjusted KDE Group Means of Overall Home Ranges

Sex         lsmean         SE         df   lower.CL   upper.CL
-------  ---------  ---------  ---------  ---------  ---------
female    23.37885   3.014774   15.29042   16.96363   29.79408
male      33.35191   3.866392   23.85930   25.36958   41.33424

Seasonal Home Range

Seasonal Home Range.

Home range analysis broken down by five seasons; Emergence, Dry, Monsoon, Post Monsoon. The start of emergence was defined by when movement patterns increased from none/minimal to the start of high activity. Effort was taken to match as closely as possible to the Owl Head Buttes emergence date interval. Monsoon season was adjusted using NOAA climate data. The start of was defined when the mean dew point temperatures of three consecutive days were greater than 55 degrees.

Scaling home range analyses by seasonal estimates reduces the number or locations for each lizard. 100% MCPs were used for seasonal home range analyses to avoid any further reduction of locations for each estimation.

Seasonal home ranges at Stone Canyon varied in size between seasons but did not seem shift (Fig.___), with seasonal home ranges overlapping each other, only expanding or collapsing between seasons. Home range patterns at Stone Canyon did not display the same seasonal variation in home range sizes that was observed at Owl Head Buttes. At Stone Canyon, Gila Monsters had relatively smaller home ranges throughout the year, where the highest inflation of range size was observed during the dry season from an increase in male home ranges, 18.2 ± 5.4 S.E. ha to that of female home range sizes at 10.1 ± 2.4 S.E. ha. Females at Stone Canyon displayed similar home ranges during the monsoon season, 10.6 ± 2.5 S.E. ha. Home range sizes at Owl Head Buttes had a much larger amount of variation across seasons than did those at Stone Canyon. There were still slightly larger ranges observed during the dry season, primarily due to increased home range sizes exhibited by males 29.4 ± 4.7 S.E. ha versus females at 15.6 ± 3.8 S.E. ha. During the monsoon season, there was still yet a large influx of home ranges sizes where female home ranges increased to 22.9 ± 4.0 S.E. ha. For both populations, home ranges during the emergence and post-monsoon seasons were small, marking the beginning and ending of overwintering periods, where minimal movement is observed in both groups.

Analysis indicated that there was an effect of season (df = 3, F = 15.41, P = <0.001) as well as an interaction of environment and season (df = 3, F = 6.84, P = <0.001), indicating that changes in seasonal home ranges sizes varied between each environment. Post-Hoc analyses on the Stone Canyon data set with home range means averaged across sex, suggested that there was no significant difference in home ranges between the emergence (4.32 ± 2.55 S.E. ha) and post-monsoon seasons (5.09 ± 2.07 S.E. ha) nor dry and monsoon (12.23 ± 1.74 S.E. ha and 9.04 ± 1.78 S.E. ha). There was also no significance between emergence and dry/monsoon seasons, but there was a difference between dry and post-monsoon (df = 80.2, P = 0.04). Post-Hoc analyses on the Owl Head Buttes population indicated that there was no significant difference between emergence (3.33 ± 2.24 S.E. ha) and post-monsoon (2.36 ± 2.36 S.E.) nor dry and monsoon (18.86 ± 2.25 S.E. ha and 21.85 ± 2.03 S.E. ha) reflecting the same pattern at Stone Canyon. However, there was a significant difference between emergence and dry/monsoon (df = 69.4, P = <0.0001, and df = 68, P = <0.0001 respectively), as well as post-monsoon and dry/monsoon (df = 78.9, P = <0.0001, and df = 74, P = <0.0001). This shows a rather different pattern than seen at Stone Canyon. Pairwise analyses between the two populations indicated no difference between emergence (df = 87.7, P = 0.76) or post-monsoon (df = 89.4, P = 0.35). Differences in home range sizes between the two populations were between the dry and monsoon seasons (Fig.___). Owl Head home ranges were 58% larger than those at Stone Canyon during the dry season, and 76% larger during the monsoon season.

Table 5 | Group means of seasonal home ranges between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized). These means are averaged across sex.



Table: Raw Group Means of Seasonal Home Ranges

Environment     Season           N   Home_Range_100mcp          sd          se         ci
--------------  -------------  ---  ------------------  ----------  ----------  ---------
nonsubsidized   Dry             12          23.7166667   12.841682   3.7070742   8.159215
nonsubsidized   Emergence       10           2.8100000    3.121414   0.9870776   2.232925
nonsubsidized   Monsoon         13          23.6538462    9.446482   2.6199828   5.708452
nonsubsidized   Post_Monsoon    11           0.6909091    1.013365   0.3055411   0.680788
subsidized      Dry             17          13.0364706   10.574940   2.5647997   5.437133
subsidized      Emergence        9           2.0977778    1.649566   0.5498555   1.267969
subsidized      Monsoon         18          10.5600000    7.518662   1.7721657   3.738943
subsidized      Post_Monsoon    14           2.9885714    5.044404   1.3481737   2.912552
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Home_Range_100mcp ~ Environment + Season + Sex + N + Environment *  
    Season + (1 | Gila)
   Data: seasonal

REML criterion at convergence: 638.5

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-2.0273 -0.5931 -0.0665  0.2579  3.2815 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept)  4.442   2.108   
 Residual             44.819   6.695   
Number of obs: 100, groups:  Gila, 30

Fixed effects:
                                          Estimate Std. Error        df t value Pr(>|t|)
(Intercept)                               14.61312    2.89899  78.80446   5.041 2.89e-06
Environmentsubsidized                     -6.62866    2.80355  88.30266  -2.364  0.02025
SeasonEmergence                          -15.53191    3.06290  69.30082  -5.071 3.16e-06
SeasonMonsoon                              2.99228    2.88291  67.22814   1.038  0.30302
SeasonPost_Monsoon                       -16.49965    3.21222  78.88963  -5.137 1.97e-06
Sexmale                                    2.64121    1.69487  29.11504   1.558  0.12995
N                                          0.10913    0.03989  72.75357   2.735  0.00782
Environmentsubsidized:SeasonEmergence      7.62510    4.16148  75.14358   1.832  0.07087
Environmentsubsidized:SeasonMonsoon       -6.17899    3.69021  67.26127  -1.674  0.09869
Environmentsubsidized:SeasonPost_Monsoon   9.36224    3.88337  68.51543   2.411  0.01860
                                            
(Intercept)                              ***
Environmentsubsidized                    *  
SeasonEmergence                          ***
SeasonMonsoon                               
SeasonPost_Monsoon                       ***
Sexmale                                     
N                                        ** 
Environmentsubsidized:SeasonEmergence    .  
Environmentsubsidized:SeasonMonsoon      .  
Environmentsubsidized:SeasonPost_Monsoon *  
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) Envrnm SsnEmr SsnMns SsnP_M Sexmal N      Env:SE Env:SM
Envrnmntsbs -0.629                                                        
SeasnEmrgnc -0.621  0.527                                                 
SeasonMonsn -0.581  0.562  0.524                                          
SsnPst_Mnsn -0.677  0.504  0.525  0.514                                   
Sexmale     -0.447  0.079  0.060  0.021  0.071                            
N           -0.581  0.003  0.193  0.065  0.341  0.313                     
Envrnmnt:SE  0.281 -0.614 -0.678 -0.366 -0.284  0.054  0.159              
Envrnmnt:SM  0.499 -0.696 -0.423 -0.786 -0.425 -0.051 -0.121  0.448       
Envrnm:SP_M  0.386 -0.654 -0.381 -0.407 -0.735  0.072 -0.005  0.443  0.501
Type III Analysis of Variance Table with Satterthwaite's method
                    Sum Sq Mean Sq NumDF  DenDF F value    Pr(>F)    
Environment         261.63  261.63     1 26.365  5.8375 0.0229042 *  
Season             2072.56  690.85     3 78.967 15.4143 5.534e-08 ***
Sex                 108.84  108.84     1 29.115  2.4285 0.1299532    
N                   335.38  335.38     1 72.754  7.4829 0.0078202 ** 
Environment:Season  920.94  306.98     3 71.524  6.8493 0.0004028 ***
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Table 6 | Seasonal home range means between Stone Canyon (subsidized) and Owl Head Buttes (non-subsidized) popuations for males and females. These are raw means before being adjusted for environment, season, sex, and sample size.



Table: Seasonal Means by Sex Between Populations

Environment     Season         Sex        N   Home_Range_100mcp           sd          se           ci
--------------  -------------  -------  ---  ------------------  -----------  ----------  -----------
nonsubsidized   Dry            female     5          15.6600000    8.6291946   3.8590932   10.7145603
nonsubsidized   Dry            male       7          29.4714286   12.6476235   4.7803524   11.6971008
nonsubsidized   Emergence      female     5           4.4600000    3.4333657   1.5354478    4.2630866
nonsubsidized   Emergence      male       5           1.1600000    1.8242807   0.8158431    2.2651436
nonsubsidized   Monsoon        female     6          22.9833333    9.8151753   4.0070285   10.3003948
nonsubsidized   Monsoon        male       7          24.2285714    9.8668999   3.7293376    9.1253605
nonsubsidized   Post_Monsoon   female     4           1.4000000    1.4491377   0.7245688    2.3059014
nonsubsidized   Post_Monsoon   male       7           0.2857143    0.3670993   0.1387505    0.3395102
subsidized      Dry            female    11          10.1754545    8.0883118   2.4387178    5.4338018
subsidized      Dry            male       6          18.2816667   13.2661214   5.4158714   13.9219406
subsidized      Emergence      female     6           2.1133333    1.8474920   0.7542354    1.9388239
subsidized      Emergence      male       3           2.0666667    1.5326556   0.8848792    3.8073277
subsidized      Monsoon        female    11          10.6918182    8.4988679   2.5625051    5.7096172
subsidized      Monsoon        male       7          10.3528571    6.3010018   2.3815548    5.8274547
subsidized      Post_Monsoon   female    11           3.6309091    5.5527983   1.6742317    3.7304207
subsidized      Post_Monsoon   male       3           0.6333333    0.8007705   0.4623250    1.9892241

Adjusted Seasonal Means

Post-Hoc comparisons between populations for seasonal home range analysis:

$emmeans
Season = Dry:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  18.86 2.25 88.4   14.383    23.34
 subsidized     12.23 1.75 87.4    8.745    15.72

Season = Emergence:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized   3.33 2.24 88.7   -1.118     7.77
 subsidized      4.32 2.55 84.7   -0.741     9.39

Season = Monsoon:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized  21.85 2.03 87.5   17.811    25.89
 subsidized      9.04 1.78 86.0    5.515    12.57

Season = Post_Monsoon:
 Environment   emmean   SE   df lower.CL upper.CL
 nonsubsidized   2.36 2.36 87.0   -2.322     7.04
 subsidized      5.09 2.07 85.8    0.981     9.21

Results are averaged over the levels of: Sex 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized    6.629 2.81 88.3  2.358  0.0206 

Season = Emergence:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   -0.996 3.32 87.7 -0.300  0.7648 

Season = Monsoon:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   12.808 2.66 87.2  4.814  <.0001 

Season = Post_Monsoon:
 contrast                   estimate   SE   df t.ratio p.value
 nonsubsidized - subsidized   -2.734 2.96 89.4 -0.924  0.3581 

Results are averaged over the levels of: Sex 

Graphical Comparisons of seasons between the two populatins:

Figure 11 | Pairwise comparisons of each season between environments. Overlapping red bars indicate no statistical difference.

$emmeans
Environment = nonsubsidized:
 Season       emmean   SE   df lower.CL upper.CL
 Dry           18.86 2.25 88.4   14.383    23.34
 Emergence      3.33 2.24 88.7   -1.118     7.77
 Monsoon       21.85 2.03 87.5   17.811    25.89
 Post_Monsoon   2.36 2.36 87.0   -2.322     7.04

Environment = subsidized:
 Season       emmean   SE   df lower.CL upper.CL
 Dry           12.23 1.75 87.4    8.745    15.72
 Emergence      4.32 2.55 84.7   -0.741     9.39
 Monsoon        9.04 1.78 86.0    5.515    12.57
 Post_Monsoon   5.09 2.07 85.8    0.981     9.21

Results are averaged over the levels of: Sex 
Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Environment = nonsubsidized:
 contrast                 estimate   SE   df t.ratio p.value
 Dry - Emergence            15.532 3.07 69.4  5.054  <.0001 
 Dry - Monsoon              -2.992 2.89 67.3 -1.036  0.7292 
 Dry - Post_Monsoon         16.500 3.24 78.9  5.098  <.0001 
 Emergence - Monsoon       -18.524 2.91 68.0 -6.361  <.0001 
 Emergence - Post_Monsoon    0.968 3.08 73.0  0.314  0.9891 
 Monsoon - Post_Monsoon     19.492 3.03 74.0  6.426  <.0001 

Environment = subsidized:
 contrast                 estimate   SE   df t.ratio p.value
 Dry - Emergence             7.907 3.11 88.6  2.543  0.0602 
 Dry - Monsoon               3.187 2.28 66.0  1.395  0.5070 
 Dry - Post_Monsoon          7.137 2.68 80.2  2.666  0.0450 
 Emergence - Monsoon        -4.720 3.20 89.6 -1.475  0.4569 
 Emergence - Post_Monsoon   -0.769 2.94 77.2 -0.262  0.9937 
 Monsoon - Post_Monsoon      3.951 2.78 84.9  1.421  0.4899 

Results are averaged over the levels of: Sex 
P value adjustment: tukey method for comparing a family of 4 estimates 

Graphical Comparisons between seasons within the two populations:

Figure 12 | Pairwise comparisons between seasons within each environment against estimated marginal means. Overlapping red bars indicate no statistical difference.

$emmeans
Season = Dry:
 Sex    emmean   SE   df lower.CL upper.CL
 female   6.92 2.19 47.2    2.523     11.3
 male    20.36 2.77 48.3   14.798     25.9

Season = Emergence:
 Sex    emmean   SE   df lower.CL upper.CL
 female   5.00 2.91 45.2   -0.853     10.9
 male     5.63 4.00 49.0   -2.403     13.7

Season = Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female   6.27 2.34 46.2    1.560     11.0
 male    11.39 2.51 48.4    6.354     16.4

Season = Post_Monsoon:
 Sex    emmean   SE   df lower.CL upper.CL
 female   5.94 2.09 47.9    1.738     10.1
 male     3.09 3.99 48.5   -4.937     11.1

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast      estimate   SE   df t.ratio p.value
 female - male  -13.441 3.68 47.2 -3.653  0.0006 

Season = Emergence:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -0.632 4.73 49.0 -0.134  0.8943 

Season = Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male   -5.121 3.53 47.1 -1.449  0.1539 

Season = Post_Monsoon:
 contrast      estimate   SE   df t.ratio p.value
 female - male    2.847 4.36 48.9  0.652  0.5173 

Graphical Comparisons between sex within the subsidized population:

Table 7 | Mean individual seasonal home ranges pooled from the entire study period. Missing values are depicted where no locations for that animal during that period were successfull.



Table: Seasonal Individual Home Ranges.

X        Emergence   X.1         X.2     Dry     X.3     Monsoon   X.4      Post.Monsoon   X.5   
-------  ----------  ----------  ------  ------  ------  --------  -------  -------------  ------
Lizard   Sex         Area (ha)   N       Area    N       Area      N        Area           N     
M69      Male        0.33        4.00    36.73   24.00   14.84     22.00    0.07           8.00  
M67      Male        NA          NA      5.71    9.00    7.72      7.00     NA             NA    
M255     Male        3.23        7.00    NA      NA      1.07      9.00     NA             NA    
M215     Male        2.64        7.00    8.28    11.00   7.22      12.00    NA             NA    
M14      Male        NA          NA      6.20    15.00   7.50      10.00    NA             NA    
M119     Male        NA          NA      27.84   17.00   19.98     67.00    1.55           9.00  
M112     Male        NA          NA      24.93   16.00   14.14     29.00    0.28           8.00  
F66      Female      0.33        5.00    9.60    97.00   33.65     79.00    1.36           16.00 
F36      Female      2.94        12.00   24.99   99.00   10.30     118.00   19.14          27.00 
F252     Female      1.27        8.00    2.54    14.00   6.48      30.00    0.39           9.00  
F214     Female      NA          NA      5.04    10.00   7.79      28.00    1.87           9.00  
F200     Female      NA          NA      4.71    8.00    4.23      40.00    2.05           12.00 
F147     Female      5.44        14.00   25.52   57.00   18.21     70.00    7.14           18.00 
F146     Female      NA          NA      9.55    22.00   5.97      17.00    0.03           7.00  
F137     Female      1.71        6.00    6.54    43.00   6.95      62.00    2.19           17.00 
F135     Female      NA          N       3.71    25.00   5.72      48.00    0.68           5.00  
F114     Female      0.99        12.00   13.66   99.00   10.72     84.00    4.56           24.00 
F104     Female      NA          NA      6.07    70.00   7.59      49.00    0.53           13.00 
                                                                                                 
Means    Overall     1.89                13.04           10.56              2.99                 
         Male        2.07                18.28           10.35              0.63                 
         Female      2.11                10.18           10.69              3.63                 

Seasonal Home Range (KDE)

Table | Raw KDE group means of seasonal home ranges between sexes at Stone Canyon (subsidized).



Table: Raw KDE Group Means of Seasonal Home Ranges between sexes

Season         Sex        N   Home_Range_95kde          sd          se          ci
-------------  -------  ---  -----------------  ----------  ----------  ----------
Dry            female    11           21.05545   10.148020    3.059743    6.817533
Dry            male       6           42.79833   32.570181   13.296721   34.180309
Emergence      female     5           16.42400    9.143160    4.088946   11.352733
Emergence      male       1           14.93000          NA          NA         NaN
Monsoon        female    11           21.41909   11.124279    3.354096    7.473393
Monsoon        male       7           31.36143    9.216007    3.483323    8.523385
Post_Monsoon   female     9           14.25111   14.074176    4.691392   10.818369
Post_Monsoon   male       3            3.49000    4.186419    2.417030   10.399640


Table: Raw KDE Group Means of Seasonal Home Ranges

Season           N   Home_Range_95kde          sd         se          ci
-------------  ---  -----------------  ----------  ---------  ----------
Dry             17           28.72941   22.596045   5.480346   11.617814
Emergence        6           16.17500    8.200604   3.347883    8.606006
Monsoon         18           25.28556   11.298004   2.662965    5.618365
Post_Monsoon    12           11.56083   13.074142   3.774180    8.306914
Linear mixed model fit by REML. t-tests use Satterthwaite's method ['lmerModLmerTest']
Formula: Home_Range_95kde ~ Season + Sex + N + Season * Sex + (1 | Gila)
   Data: season.kde

REML criterion at convergence: 385.8

Scaled residuals: 
    Min      1Q  Median      3Q     Max 
-1.5521 -0.4814 -0.0391  0.3078  4.0086 

Random effects:
 Groups   Name        Variance Std.Dev.
 Gila     (Intercept)  28.37    5.327  
 Residual             195.80   13.993  
Number of obs: 53, groups:  Gila, 18

Fixed effects:
                            Estimate Std. Error        df t value Pr(>|t|)   
(Intercept)                 18.23503    6.63026  38.31066   2.750  0.00904 **
SeasonEmergence             -2.97944    8.74706  43.60362  -0.341  0.73502   
SeasonMonsoon               -0.05632    6.01025  29.39051  -0.009  0.99259   
SeasonPost_Monsoon          -5.02474    7.19019  40.48869  -0.699  0.48865   
Sexmale                     23.42265    8.37161  41.14357   2.798  0.00779 **
N                            0.05703    0.09819  33.91214   0.581  0.56521   
SeasonEmergence:Sexmale    -22.86106   17.87036  41.46355  -1.279  0.20791   
SeasonMonsoon:Sexmale      -11.51090    9.83940  29.98032  -1.170  0.25127   
SeasonPost_Monsoon:Sexmale -35.74342   12.19911  34.68513  -2.930  0.00596 **
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Correlation of Fixed Effects:
            (Intr) SsnEmr SsnMns SsnP_M Sexmal N      SsnE:S SsnM:S
SeasnEmrgnc -0.656                                                 
SeasonMonsn -0.359  0.281                                          
SsnPst_Mnsn -0.722  0.517  0.355                                   
Sexmale     -0.676  0.444  0.303  0.496                            
N           -0.732  0.476 -0.120  0.476  0.421                     
SsnEmrgnc:S  0.300 -0.476 -0.141 -0.240 -0.423 -0.205              
SsnMnsn:Sxm  0.283 -0.213 -0.600 -0.258 -0.625 -0.014  0.290       
SsnPst_Mn:S  0.382 -0.276 -0.216 -0.561 -0.587 -0.221  0.262  0.423

ANOVA Table. Seasonal KDE

Type III Analysis of Variance Table with Satterthwaite's method
            Sum Sq Mean Sq NumDF  DenDF F value   Pr(>F)   
Season     2654.14  884.71     3 39.026  4.5184 0.008181 **
Sex         179.65  179.65     1 25.426  0.9175 0.347144   
N            66.05   66.05     1 33.912  0.3373 0.565207   
Season:Sex 1743.14  581.05     3 36.391  2.9675 0.044584 * 
---
Signif. codes:  0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1

Raw Seasonal KDE Means

Adjusted Seasonal KDE Means

$emmeans
Season = Dry:
 Sex    emmean    SE   df lower.CL upper.CL
 female  19.99  4.91 41.5    10.09     29.9
 male    43.42  6.39 42.1    30.53     56.3

Season = Emergence:
 Sex    emmean    SE   df lower.CL upper.CL
 female  17.01  7.24 42.4     2.41     31.6
 male    17.58 15.47 43.6   -13.61     48.8

Season = Monsoon:
 Sex    emmean    SE   df lower.CL upper.CL
 female  19.94  5.25 40.8     9.33     30.6
 male    31.85  5.73 42.2    20.29     43.4

Season = Post_Monsoon:
 Sex    emmean    SE   df lower.CL upper.CL
 female  14.97  5.29 41.3     4.29     25.7
 male     2.65  9.13 43.3   -15.77     21.1

Degrees-of-freedom method: kenward-roger 
Confidence level used: 0.95 

$contrasts
Season = Dry:
 contrast      estimate    SE   df t.ratio p.value
 female - male  -23.423  8.47 41.2 -2.765  0.0085 

Season = Emergence:
 contrast      estimate    SE   df t.ratio p.value
 female - male   -0.562 16.72 43.7 -0.034  0.9734 

Season = Monsoon:
 contrast      estimate    SE   df t.ratio p.value
 female - male  -11.912  8.07 41.2 -1.475  0.1477 

Season = Post_Monsoon:
 contrast      estimate    SE   df t.ratio p.value
 female - male   12.321 10.14 43.9  1.215  0.2308 

Home Range Overlap (MCP)

Gila Monster Home Range Overlap of 100% MCPs.

Figure 13 | Interactive map: Home Range overlap by sex of 100% MCPs at Stone Canyon. Red polygons represent female lizards, and blue represents male lizards.

The Stone Canyon population seems to exhibit greater female-female overlap as well as considerable overlap of male-female home ranges. There appears to be limited male-male overlap, with occurance happening in only two male-male home range polygons. This finding is in contrast to the Owl Head buttes study which revealed that there was a large degree of overlap among male-female and male-male overlaps (Table x). Gillardo concluded that, in their study, the high degree of overlap in males-males interactions may be due to having larger home ranges for mate searching activities. Males may have and increased home range size to maximize their access to multiple females. She concluded that the lack of female-female overlap may be due to smaller home range sizes.

At Stone Canyon, males have reduced home range sizes (Table 6; Fig. 4). However, males still retain home range overlap with multiple females while having reduced contact with other males. This may be in response to nutrient subsidies that reduce the need to have expanded home range sizes for foraging activities for both males and females. There may also be a higher density of females as a response to resource availability and reduced range requirements. Males are not forced to expand home ranges for mate searching to the extant that individuals at Owl Head Buttes may be subject to.

Table 8 | Home range overlap of Gila Monsters at the nutrient subsidized site. Male-male overlaps only occured between two pairs of males: M14-M69 and M119-M215 at 0.5 ha. and 19.5 ha. respectively and were therefore not included in the table.



Table: Home range overlap of Stone Canyon Gila Monsters using 100% MCPs.

ID              F36          F66    F104   F135   F137   F146   F147   X             M14           M67    M69    M112    M119    M215    M255 
--------------  -----------  -----  -----  -----  -----  -----  -----  ------------  ------------  -----  -----  ------  ------  ------  -----
Female:Female                                                          Male:Female                                                            
F36             _            5.13   _      _      _      4.65   _                    _             _      _      _       19.44   18.51   _    
F66             5.13         _      _      _      _      5.05   _                    _             _      2.6    _       _       _       _    
F104            _            _      _      0.5           _      _                    _             _      _      _       _       _       _    
F114            _            _      _      _      _      _      _                    _             _      _      5.82    _       _       _    
F135            _            _      0.5    _      2.89   _      3.94                 _             _      2.04   _       _       _       _    
F137            _            _      _      2.89   _      _      7.91                 _             _      0.55   _       _       _       _    
F146            4.65         5.05   _      _      _      _      _                    0.14          _      0.76   _       _       _       _    
F147            _            _      _      3.94   7.91   _      _                    3.73          0.21   4.6    _       _       _       _    
F200            _            _      _      _      _      _      _                    _             _      _      6.49    _       _       _    
F252            _            _      _      _      _      _      _                    _             _      _      _       _       _       3.45 
                                                                                                                                              
Mean =          4.3 ± 0.86                                             Mean =        5.26 ± 1.78                                              
                                                                                                                                              
                                                                                                                                              
ID              F36          F66    F104   F135   F137   F146   F147                 M14           M67    M69    M112    M119    M215    M255 
Female:Female                                                          Male:Female                                                            
Net             6.84         7.25   0.5    4.44   7.91   6.77   8.96                 3.87          0.21   8.57   12.31   21.24   20.32   3.45 
Prportion       0.2          0.2    0.1    0.5    1      0.7    0.3                  0.4           0.02   0.5    0.4     0.6     1       0.2  


Table: Home Range Overlap Summary

Interaction       N         OL          sd          se          ci
--------------  ---  ---------  ----------  ----------  ----------
Female_Female     7   4.295714    2.271694   0.8586198    2.100967
Male_Female      13   5.256923    6.429806   1.7833074    3.885493
Male_Male         4   9.980000   10.958108   5.4790541   17.436795

Home Range Overlap (KDE)

Figure 14 | Interactive map: Home Range overlap by sex of 95% KDEs at Stone Canyon. Red polygons represent female lizards, and blue represents male lizards.

LS0tCnRpdGxlOiAiU3BhdGlhbCBFY29sb2d5IEdpbGEgTW9uc3RlcnMgaW4gYSBSZXNvdXJjZSBTdWJzaWRpemVkIEVudmlyb25tZW50IgphdXRob3I6ICJNLiBQaWVyc29uIgpvdXRwdXQ6CiAgaHRtbF9ub3RlYm9vazoKICBkZl9wcmludDogcGFnZWQKICByb3dzLnByaW50OiAxMAogIHRoZW1lOiBjb3NtbwogIGhpZ2hsaWdodDogYnJlZXplZGFyawogIG51bWJlcl9zZWN0aW9uczogeWVzCiAgdG9jOiB0cnVlCiAgdG9jX2Zsb2F0OiB0cnVlCiAgY29sbGFwc2VkOiBmYWxzZQogIHNtb290aF9zY3JvbGw6IHRydWUKcGRmX2RvY3VtZW50OiBkZWZhdWx0CmVkaXRvcl9vcHRpb25zOiAKY2h1bmtfb3V0cHV0X3R5cGU6IGlubGluZQotLS0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4KCmgxLnRpdGxlIHsKICBmb250LXNpemU6IDQwcHg7CiAgZm9udC1mYW1pbHk6ICJDYWxpYnJpIiwgVGltZXMsIHNlcmlmOwogIGNvbG9yOiBEYXJrQmx1ZTsKICB0ZXh0LWFsaWduOiBjZW50ZXI7Cn0KaDQuYXV0aG9yIHsgLyogSGVhZGVyIDQgLSBhbmQgdGhlIGF1dGhvciBhbmQgZGF0YSBoZWFkZXJzIHVzZSB0aGlzIHRvbyAgKi8KICBmb250LXNpemU6IDIwcHg7CiAgZm9udC1mYW1pbHk6ICJUaW1lcyBOZXcgUm9tYW4iLCBUaW1lcywgc2VyaWY7CiAgY29sb3I6IERhcmtCbHVlOwogIHRleHQtYWxpZ246IGNlbnRlcjsKfQo8L3N0eWxlPgoKIyBBQlNUUkFDVDogCkFuaW1hbCBtb3ZlbWVudHMgYXJlIG9mdGVuIGRlZmluZWQgdXNpbmcgdGhlIGhvbWUgcmFuZ2UgY29uY2VwdC4gQ29uc2VxdWVudGx5LCBob21lIHJhbmdlcyBhcmUgZGV0ZXJtaW5lZCBieSB0ZW1wb3JhbCwgc3BhdGlhbCwgYW5kIGluZGl2aWR1YWwtbGV2ZWwgcHJvY2Vzc2VzLiBXaXRoaW4gdGhlIGVudmlyb25tZW50LCBvbmUgb2YgdGhlIGtleSBmYWN0b3JzIGluZmx1ZW5jaW5nIGFuIGFuaW1hbOKAmXMgcmFuZ2UgYW5kIGhvdyBpdCB1c2VzIHRoZSBlbnZpcm9ubWVudCBpcyB0aGF0IG9mIHJlc291cmNlcy4gIEFsdGVyYXRpb25zIHRvIHRoZSBlbnZpcm9ubWVudCB0aGF0IGFmZmVjdCByZXNvdXJjZSBkaXN0cmlidXRpb24gYW5kIGF2YWlsYWJpbGl0eSBjYW4gaGF2ZSBwcm9mb3VuZCBjb25zZXF1ZW5jZXMgb24gYW4gYW5pbWFs4oCZcyBzcGF0aWFsIHBhdHRlcm5zLiBPbmUgb2YgdGhlIGJlc3QgZXhhbXBsZXMgb2YgdGhpcyBpcyB0aGF0IG9mIGdvbGYgY291cnNlcy4gIFNvbWUgZW52aXJvbm1lbnRhbCBtb2RpZmljYXRpb25zIGV4aGliaXRlZCBieSBzb21lIGh1bWFuIGFsdGVyZWQgZW52aXJvbm1lbnQgY2FuIGhhdmUgcG9zaXRpdmUgZWZmZWN0cyBvbiBjZXJ0YWluIHdpbGRsaWZlIHNwZWNpZXMgYnkgYWx0ZXJpbmcgdGhlaXIgbW92ZW1lbnQgcGF0dGVybnMgYW5kIGZvcmFnaW5nIGVmZm9ydHMuICBXZSBhbmFseXplZCBkYXRhIGNvbGxlY3RlZCBmcm9tIDIyIEdpbGEgTW9uc3RlcnMgSGVsb2Rlcm1hIHN1c3BlY3R1bSBhdCBhIHN1YnNpZGl6ZWQgZW52aXJvbm1lbnQgaW4gQXJpem9uYSBmcm9tIDIwMDcgdG8gMjAxMyBhbmQgYSBub24tc3Vic2lkaXplZCBlbnZpcm9ubWVudC4gIFdlIHBlcmZvcm1lZCBib3RoIGtlcm5lbCBkZW5zaXR5IGVzdGltYXRpb24gYW5kIG1pbmltdW0gY29udmV4IHBvbHlnb25zIGZvciBjb21wYXJhYmlsaXR5IHB1cnBvc2VzLiAgQWZ0ZXIgYWRqdXN0aW5nIGZvciBzZXgsIG51bWJlciBvZiBmaXhlcywgYW5kIHllYXIsIG1hbGVzIGluIHRoZSBzdWJzaWRpemVkIGVudmlyb25tZW50IGhhZCBhbiBhdmVyYWdlIGFyZWEgb2YgMTUuOSBoYSB3aGlsZSB0aGUgZmVtYWxlcyBoYWQgYW4gYXJlYSBvZiA1LjkgaGEuICBJbiB0aGUgdW4tc3Vic2lkaXplZCBlbnZpcm9ubWVudCBtYWxlcyBoYWQgYW4gYXZlcmFnZSByYW5nZSBvZiAzOC44IGhhIHdoaWxlIGZlbWFsZXMgaGFkIGFuIGFyZWEgb2YgMjkuOCBoYS4gIFRoaXMgc3VnZ2VzdHMgdGhhdCB0aGUgaG9tZSByYW5nZXMgbWF5IGJlIHNtYWxsZXIgaW4gc3Vic2lkaXplZCBlbnZpcm9ubWVudHMgdGhhbiB0aG9zZSBvZiB1bi1zdWJzaWRpemVkIGVudmlyb25tZW50cyBkdWUgdG8gaW5jcmVhc2VzIGluIGF2YWlsYWJsZSByZXNvdXJjZXMuIFRoZXJlIHdlcmUgYWxzbyBkaWZmZXJlbmNlcyBpbiBob21lIHJhbmdlIG92ZXJsYXAgd2l0aGluIGFuZCBiZXR3ZWVuIHNleGVzLiBJbiB0aGUgc3Vic2lkaXplZCBwb3B1bGF0aW9uLCB0aGVyZSB3YXMgdmVyeSBsaXR0bGUgbWFsZS1tYWxlIG92ZXJsYXAgd2l0aCBvbmx5IHR3byBvY2N1cmFuY2VzLCBtb3JlIGZlbWFsZS1mZW1hbGUgb3ZlcmxhcCBhbmQgbWFsZS1mZW1hbGUgb3ZlcmxhcCB3YXMgaW5jcmVhc2VkLiBNYWxlIGhvbWUgcmFuZ2VzIG9mdGVuIG92ZXJsYXBwZWQgc2V2ZXJhbCBmZW1hbGUgaG9tZSByYW5nZXMuIEdpbGEgTW9uc3RlcnMgbWF5IG5vdCBoYXZlIHRvIGludmVzdCBpbiB3aWRlIHJhbmdpbmcgZm9yYWdpbmcgZWZmb3J0cyBhcyB0aG9zZSBwb3B1bGF0aW9ucyBvZiB0aGUgdW4tc3Vic2lkaXplZCBlbnZpcm9ubWVudHMuICAKCgpPdmVydmlldyBvZiB0aGUgc3BhdGlhbCBlY29sb2d5IG9mIEdpbGEgTW9uc3RlcnMgKCpIZWxvZGVybWEgc3VzcGVjdHVtKikgYXQgU3RvbmUgQ2FueW9uIEdvbGYgQ2x1YiBhcyBhIHJlc291cmNlIHN1YnNpZGl6ZWQgcG9wdWxhdGlvbiB2cy4gT3dsIEhlYWQgQnV0dGVzIHJlcHJlc2VudGluZyB0aGUgdW5zdWJzaXplZCBuYXR1cmFsIHBvcHVsYXRpb24uIENvbXBhcmVkIGhvbWUgcmFuZ2Ugc2l6ZXMgb2YgKkhlbG9kZXJtYSBzdXNwZWN0dW0qIGJldHdlZW4gdHdvIHBvcHVsYXRpb25zLiBPbmUgcmVwcmVzZW50ZWQgYSBzdWJzaWRpemVkIHBvcHVsYXRpb24gYXQgU3RvbmUgQ2FueW9uIEdvbGYgQ2x1YiBhbmQgdGhlIG90aGVyIGF0IE93bCBIZWFkIEJ1dHRlcyByZXByZXNlbnRpbmcgdGhlIHVuc3Vic2lkaXplZCBwb3B1bGF0aW9uLiBTdG9uZSBDYW55b24gaXMgbG9jYXRlZCBpbiBPcm8gVmFsbGV5IG9uIHRoZSBub3J0aCBlbmQgb2YgVHVjc29uLCBBcml6b25hLiAgT3dsIEhlYWQgQnV0dGVzIGlzIGxvY2F0ZWQgYWJvdXQgMTcga20gc3RyYWlnaHQgbGluZSBkaXN0YW5jZSBub3J0aCB3ZXN0IGZyb20gU3RvbmUgQ2FueW9uLiBEYXRhIGF0IE93bCBIZWFkIHdhcyBjb2xsZWN0ZWQgZnJvbSAyMDAwIC0gMjAwMiwgd2hpbGUgZml4ZXMgd2VyZSBjb2xsZWN0ZWQgZnJvbSAyMDA3IC0gMjAxMyBhdCBTdG9uZSBDYW55b24uIFdlIENhbGN1bGF0ZWQgbWluaW11bSBjb252ZXggcG9seWdvbnMgdXNpbmcgYm90aCA5NSBwZXJjZW50IGFuZCAxMDAgcGVyY2VudCBvZiB0aGUgbG9jYXRpb25zIGZvciBlYWNoIGxpemFyZCwgYXMgd2VsbCBhcyA5NSUgYW5kIDUwJSBLZXJuZWwgRGVuc2l0eSBFc3RpbWF0aW9ucyAoS0RFKS4KCgpgYGB7ciBzZXR1cCwgaW5jbHVkZT1GQUxTRX0KIyBMT0FEIFBBQ0tBR0VTIAoKbGlicmFyeSh0aWR5dmVyc2UpIApsaWJyYXJ5KGtuaXRyKSAjICBtYWtlIHRhYmxlcwpsaWJyYXJ5KGxlYWZsZXQpCmxpYnJhcnkobG1lNCkKbGlicmFyeShsbWVyVGVzdCkKbGlicmFyeShyZWFkcikKbGlicmFyeShnZ3Bsb3QyKQojIGxpYnJhcnkoZHBseXIpCmxpYnJhcnkoZ2dmb3J0aWZ5KQpsaWJyYXJ5KG9yZGluYWwpCmxpYnJhcnkobHNtZWFucykKbGlicmFyeShlbW1lYW5zKQpsaWJyYXJ5KG1hcHZpZXcpCmxpYnJhcnkoYWRlaGFiaXRhdEhSKQojIGxpYnJhcnkoT3BlblN0cmVldE1hcCkKbGlicmFyeShnZ21hcCkKI2tuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGggPSA1LCBmaWcuYXNwID0gMS8zKSAjZm9yY2UgZmlndXJlcyB0byBiZSBjZXJ0YWluIHNpemUgYW5kIGFzcGVjdCByYXRpbwpgYGAKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFLCBjYWNoZT1UUlVFfQojIGdnbWFwOjpyZWdpc3Rlcl9nb29nbGUoa2V5ID0gIkFJemFTeUJqaGhFOXBlUkJtUzFoOVdZUXgxazVNRl9YQVhxVWZTcyIpCgojIHAzPC0gZ2dtYXAoZ2V0X2dvb2dsZW1hcChjZW50ZXIgPSBjKGxvbiA9IC0xMTAuOTkwODgsIGxhdCA9IDMyLjQ2ODc4KSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IDE1LCBzY2FsZSA9IDIsbWFwdHlwZSA9J3NhdGVsbGl0ZScsYXJjaGl2aW5nID0gVFJVRSwKIyAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAnY29sb3InKSkKCiMgcDMKCkxvbmdpdHVkZTwtYygtMTEwLjk3OCwtMTEwLjk3OCwtMTEwLjk4MCwtMTEwLjk4MywtMTEwLjk4NSwtMTEwLjk4OCwtMTEwLjk5MCwtMTEwLjk5NCwtMTEwLjk5NSwKICAgICAgICAgICAgIC0xMTAuOTk3LC0xMTEuMDAzLC0xMTEuMDA0LC0xMTEuMDA0MiwtMTExLjAwMCwtMTEwLjk5NSwtMTEwLjk4NSwtMTEwLjk3OCwtMTEwLjk4KQoKTGF0aXR1ZGU8LWMoMzIuNDYzLDMyLjQ2MiwzMi40NjIsMzIuNDYxLDMyLjQ2MSwzMi40NjAsMzIuNDYyLDMyLjQ2NCwzMi40NjYsMzIuNDY4LDMyLjQ2OCwKICAgICAgICAgICAgMzIuNDY5LDMyLjQ3MywzMi40NzMzLDMyLjQ3MiwzMi40NzQsMzIuNDcxLDMyLjQ2NykKCm15Y29vcmRkYXRhIDwtIGFzLmRhdGEuZnJhbWUoY2JpbmQoTG9uZ2l0dWRlLExhdGl0dWRlKSkKCnAzK2dlb21fcG9seWdvbihkYXRhPW15Y29vcmRkYXRhLGFlcyh4PUxvbmdpdHVkZSx5PUxhdGl0dWRlKSxhbHBoYT0wLjIsY29sb3VyPSJyZWQiLAogICAgICAgICAgICAgICAgZmlsbD0icmVkIikrCiAgZ2VvbV9wYXRoKGRhdGE9bXljb29yZGRhdGEsYWVzKHg9TG9uZ2l0dWRlLHk9TGF0aXR1ZGUpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbG91cj0id2hpdGUiLGFscGhhPTAuNCxzaXplPTIpKwogIGFubm90YXRlKCJ0ZXh0IiwgeD0tMTEwLjk4OSx5PTMyLjQ2OCxsYWJlbD0iU3RvbmUgQ2FueW9uIENsdWIiLGNvbG91cj0id2hpdGUiLHNpemU9MykrCiAgIyBzY2FsZWJhcih4Lm1pbiA9IC0xMTEuMDA1LCB4Lm1heCA9IC0xMTAuOTc1LAogICMgICAgICAgICB5Lm1pbiA9IDMyLjQ1NSwgeS5tYXggPSAzMi40ODAsIGFuY2hvciA9IE5VTEwsCiAgIyAgICAgICAgICBkaXN0ID0gNTAsIHRyYW5zZm9ybT1UUlVFLGRpc3RfdW5pdD0ibSIsIG1vZGVsID0gJ1dHUzg0JykrCiAgbGFicyh0aXRsZSA9ICJTQ0dDIFN0dWR5IFNpdGUgT3JvIFZhbGxleSBBcml6b25hIikKYGBgCkZpZ3VyZSAxIHwgU3RvbmUgQ2FueW9uIEdvbGYgQ2x1YiwgbG9jYXRlZCBpbiBPcm8gVmFsbGV5LCBBcml6b25hIG9uIHRoZSBub3J0aGVybiBlZGdlIG9mIFR1Y3Nvbi4KCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KGRpc21vKQpsaWJyYXJ5KHJnYmlmKQpsaWJyYXJ5KHV0aWxzKQpsaWJyYXJ5KHJlYWR4bCkKbGlicmFyeShzcG90aWZ5cikKbGlicmFyeShnZ3JpZGdlcykKbGlicmFyeSh2aXJpZGlzKQpsaWJyYXJ5KHJhc3RlclZpcykKCiMjIFVTSU5HIERJU01POgpleHRlbnQgPC0gZXh0ZW50KC0xMzAsLTcwLDIwLDYwKQoKSC5zdXNwIDwtIGdiaWYoImhlbG9kZXJtYSIsIHNwZWNpZXMgPSAic3VzcGVjdHVtIiwgZXh0ID0gZXh0ZW50LAogICAgICAgICAgICAgZ2VvID0gVFJVRSwgc3AgPSBUUlVFLCBkb3dubG9hZCA9IFRSVUUsCiAgICAgICAgICAgICByZW1vdmVaZXJvcyA9IFRSVUUpCgpILnN1c3BfeHkgPC0gYXMuZGF0YS5mcmFtZShjYmluZChILnN1c3BAY29vcmRzWywxXSxILnN1c3BAY29vcmRzWywyXSkpCmNvbG5hbWVzKEguc3VzcF94eSkgPC0gYygibG9uZ2l0dWRlIiwibGF0aXR1ZGUiKQoKdXMgPC0gbWFwX2RhdGEoInN0YXRlIikKCiMgZ2dwbG90KGRhdGEgPSBILnN1c3BfeHksIGFlcyh4PWxvbmdpdHVkZSwgeT1sYXRpdHVkZSkpICsKIyAgIGdlb21fcG9seWdvbihkYXRhID0gdXMsIGFlcyh4PWxvbmcsIHkgPSBsYXQsIGdyb3VwID0gZ3JvdXApLAojICAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiMgICBnZW9tX3BvaW50KCkgKyB4bGFiKCJMb25naXR1ZGUiKSArIHlsYWIoIkxhdGl0dWRlIikgKwojICAgY29vcmRfZml4ZWQoeGxpbSA9IGMoLTEyMCwtMTA2KSwgeWxpbSA9IGMoMzAsNDEpKQoKIyMgIFVTSU5HIFJHQklGOgpILnN1c3BfbHUgPC0gbmFtZV9sb29rdXAocXVlcnkgPSAnaGVsb2Rlcm1hIHN1c3BlY3R1bScsIHJldHVybiA9ICdkYXRhJykKCkguc3VzcF9jb2RlIDwtIHByaW50KGFzLmludGVnZXIobmFtZXMod2hpY2gubWF4KHRhYmxlKEguc3VzcF9sdSRudWJLZXkpKSkpKQoKb2NjX2NvdW50KHRheG9uS2V5ID0gSC5zdXNwX2NvZGUsIGdlb3JlZmVyZW5jZWQgPSBUUlVFKQoKdXNhIDwtIGlzb2NvZGVzW2dyZXAoIlVuaXRlZCBTdGF0ZXMiLCBpc29jb2RlcyRuYW1lKSwgImNvZGUiXQpILnN1c3BfZGF0YSA8LSBvY2Nfc2VhcmNoKHRheG9uS2V5ID0gSC5zdXNwX2NvZGUsIAogICAgICAgICAgICAgICAgICAgcmV0dXJuID0gJ2RhdGEnLCAKICAgICAgICAgICAgICAgICAgIGNvdW50cnkgPSB1c2EsIAogICAgICAgICAgICAgICAgICAgaGFzQ29vcmRpbmF0ZSA9IFRSVUUpCgpILnN1c3BfZGYgPC0gYXMuZGF0YS5mcmFtZShjYmluZChILnN1c3BfZGF0YSRVUyRzY2llbnRpZmljTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEguc3VzcF9kYXRhJFVTJGluc3RpdHV0aW9uQ29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEguc3VzcF9kYXRhJFVTJHN0YXRlUHJvdmluY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBILnN1c3BfZGF0YSRVUyR2ZXJiYXRpbUxvY2FsaXR5KSkKCmNvb3JkcyA8LSBjYmluZCh0eXBlLmNvbnZlcnQoSC5zdXNwX2RhdGFbWyJVUyJdXVtbImRlY2ltYWxMb25naXR1ZGUiXV0sIGFzLmlzID0gVFJVRSksCiAgICAgICAgICAgICAgICB0eXBlLmNvbnZlcnQoSC5zdXNwX2RhdGFbWyJVUyJdXVtbImRlY2ltYWxMYXRpdHVkZSJdXSwgYXMuaXMgPSBUUlVFKSkKCkguc3VzcF9pbmZvIDwtIGNiaW5kKEguc3VzcF9kZixjb29yZHMpCgpjb2xuYW1lcyhILnN1c3BfaW5mbykgPC0gYygic3BlY2llcyIsImRhdGFzZXQiLCJzdGF0ZSIsImxvY2F0aW9uIiwibG9uZ2l0dWRlIiwibGF0aXR1ZGUiKQoKbGlicmFyeShncmlkKQpOYXZhZGEgPC0gZ3JpZC50ZXh0KHBhc3RlKCJOYXZhZGEiKSx4PTAuNTUsICB5PTAuODEpClV0YWggPC0gZ3JpZC50ZXh0KHBhc3RlKCJVdGFoIiksIHg9MC4xOSwgIHk9MC4zNikKQXJpem9uYSA8LSBncmlkLnRleHQocGFzdGUoIkFyaXpvbmEiKSwgeD0wLjU1LCAgeT0wLjgxKQpDYWxpZm9ybmlhIDwtIGdyaWQudGV4dChwYXN0ZSgiQ2FsaWZvcm5pYSIpLCB4PTAuMTksICB5PTAuMzYpCk5ldy5NZXhpY28gPC0gZ3JpZC50ZXh0KHBhc3RlKCJOZXcuTWV4aWNvIiksIHg9MC41NSwgIHk9MC44MSkKCgojIyBOb3cgd2UgYXJlIHJlYWR5IHRvIGZpbmFsaXplIHRoZSBhZXN0aGV0aWNzIGFuZCBvcHRpb25zIGZvciBkaXNwbGF5aW5nIHRoZSBuZXcgZ2JpZiBkYXRhLgpnZ3Bsb3QoZGF0YSA9IEguc3VzcF9pbmZvLCBhZXMoeD1sb25naXR1ZGUsIHk9bGF0aXR1ZGUpKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGEgPSB1cywgYWVzKHg9bG9uZywgeSA9IGxhdCwgZ3JvdXAgPSBncm91cCksCiAgICAgICAgICAgICAgIGZpbGwgPSAid2hpdGUiLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV9wb2ludChhZXMoY29sb3IgPSBzdGF0ZSkpICsKICBjb29yZF9maXhlZCh4bGltID0gYygtMTE5LC0xMDcpLCB5bGltID0gYygzMSw0MSkpICsKICB4bGFiKCJMb25naXR1ZGUiKSArIHlsYWIoIkxhdGl0dWRlIikgKyBnZ3RpdGxlKCJVUyBHaWxhIE1vbnN0ZXIgRGlzdHJpYnV0aW9uIikgKyAKICBndWlkZXMoY29sb3I9Z3VpZGVfbGVnZW5kKCJMZWdlbmQiKSkgKyAKICB0aGVtZV9idygpICsgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSkpICsgCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gInJpZ2h0IikgKwogIHRoZW1lKGxlZ2VuZC50aXRsZS5hbGlnbiA9IDAuNSwgbGVnZW5kLmJveC5qdXN0ID0gImNlbnRlciIpICsKICB0aGVtZShwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9ibGFuaygpLCAKICAgICAgICBwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQogICAgICAjIGFubm90YXRpb25fY3VzdG9tKE5hdmFkYSkgKyBhbm5vdGF0aW9uX2N1c3RvbShVdGFoKSArIGFubm90YXRpb25fY3VzdG9tKEFyaXpvbmEpICsKICAgICAgIyBhbm5vdGF0aW9uX2N1c3RvbShDYWxpZm9ybmlhKSArIGFubm90YXRpb25fY3VzdG9tKE5ldy5NZXhpY28pKQpgYGAKCgoKYGBge3IgZXZhbD1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgaW5jbHVkZT1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmJpb2NsaW0gPC0gZ2V0RGF0YShuYW1lID0gIndvcmxkY2xpbSIsIHJlcyA9IDIuNSwgdmFyID0gImJpbyIsIHBhdGggPSAiLi9EYXRhLyIpCgpuYW1lcyhiaW9jbGltKSA8LSBjKCJBbm4gTWVhbiBUZW1wIiwiTWVhbiBEaXVybmFsIFJhbmdlIiwiSXNvdGhlcm1hbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgIlRlbXBlcmF0dXJlIFNlYXNvbmFsaXR5IiwiTWF4IFRlbXAgV2FybWVzdCBNbyIsIk1pbiBUZW1wIENvbGRlc3QgTW8iLAogICAgICAgICAgICAgICAgICAgICJBbm4gVGVtcCBSYW5nZSIsIk1lYW4gVGVtcCBXZXR0ZXN0IFF0ciIsIk1lYW4gVGVtcCBEcmllc3QgUXRyIiwKICAgICAgICAgICAgICAgICAgICAiTWVhbiBUZW1wIFdhcm1lc3QgUXRyIiwiTWVhbiBUZW1wIENvbGRlc3QgUXRyIiwiQW5udWFsIFByZWNpcCIsCiAgICAgICAgICAgICAgICAgICAgIlByZWNpcCBXZXR0ZXN0IE1vIiwiUHJlY2lwIERyaWVzdCBNbyIsIlByZWNpcCBTZWFzb25hbGl0eSIsCiAgICAgICAgICAgICAgICAgICAgIlByZWNpcCBXZXR0ZXN0IFF0ciIsIlByZWNpcCBEcmllc3QgUXRyIiwiUHJlY2lwIFdhcm1lc3QgUXRyIiwKICAgICAgICAgICAgICAgICAgICAiUHJlY2lwIENvbGRlc3QgUXRyIikKCiMgYmlvX2V4dGVudCA8LSBleHRlbnQoeCA9IGMoCiMgICBtaW4oSC5zdXNwX3h5JGxvbmdpdHVkZSksCiMgICBtYXgoSC5zdXNwX3h5JGxvbmdpdHVkZSksCiMgICBtaW4oSC5zdXNwX3h5JGxhdGl0dWRlKSwKIyAgIG1heChILnN1c3BfeHkkbGF0aXR1ZGUpKSkKCmJpb19leHRlbnQgPC0gZXh0ZW50KHggPSBjKAogIG1pbigtMTE4KSwKICBtYXgoLTEwNSksCiAgbWluKDMwKSwKICBtYXgoNDApKSkKCgpiaW9jbGltX2V4dGVudCA8LSBjcm9wKHggPSBiaW9jbGltLCB5ID0gYmlvX2V4dGVudCkKYmlvY2xpbV9tb2RlbCA8LSBiaW9jbGltKHggPSBiaW9jbGltX2V4dGVudCwgcCA9IEguc3VzcF94eSkKcHJlc2VuY2VfbW9kZWwgPC0gZGlzbW86OnByZWRpY3Qob2JqZWN0ID0gYmlvY2xpbV9tb2RlbCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHggPSBiaW9jbGltX2V4dGVudCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dCA9IGJpb19leHRlbnQpCgojIEguc3VzcF9pbmZvCmdwbG90KHByZXNlbmNlX21vZGVsKSArIAogIGdlb21fcmFzdGVyKGFlcyhmaWxsPXZhbHVlKSkgKwogIGdlb21fcG9seWdvbihkYXRhID0gdXMsIGFlcyh4PSBsb25nLCB5ID0gbGF0LCBncm91cCA9IGdyb3VwKSwKICAgICAgICAgICAgICAgZmlsbCA9IE5BLCBjb2xvcj0iYmxhY2siKSArCiAgZ2VvbV9wb2ludChkYXRhID0gSC5zdXNwX2luZm8sIGFlcyh4ID0gbG9uZ2l0dWRlLCB5ID0gbGF0aXR1ZGUpLCBjb2xvciA9ICJibGFjayIsIAogICAgICAgICAgICAgYWxwaGEgPSAwLjUpICsKICBzY2FsZV9maWxsX2dyYWRpZW50bihjb2xvdXJzPWMoImJyb3duIiwieWVsbG93IiwiZGFya2dyZWVuIiksICJQcm9iYWJpbGl0eSIpICsKICBjb29yZF9maXhlZCh4bGltID0gYygtMTE3LC0xMDYpLCB5bGltID0gYygzMSwzOSkpICsKICB4bGFiKCJMb25naXR1ZGUiKSArIHlsYWIoIkxhdGl0dWRlIikgKyBnZ3RpdGxlKCJQcm9iYWJpbGl0eSBvZiBHaWxhIE1vbnN0ZXIgT2NjdXJyZW5jZSIpICsgCiAgdGhlbWVfYncoKSArIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUpKSArIAogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpKwogIHRoZW1lKHBhbmVsLmdyaWQubWFqb3IgPSBlbGVtZW50X2JsYW5rKCksIAogICAgICAgIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKCgoKCgojIE92ZXJhbGwgWWVhcmx5IEhvbWUgUmFuZ2VzIChNQ1ApCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+U3VtbWFyeSBvZiBob21lIHJhbmdlIHNpemUuPC9zcGFuPgoKVGFibGUgMSB8IFBvb2xlZCBvdmVyYWxsIGhvbWUgcmFuZ2VzIG9mIEdpbGEgTW9uc3RlcnMgYXQgT3dsIEhlYWQgQnV0dGVzIGFuZCBTdG9uZSBDYW55b24gR29sZiBDbHViLiBCb3RoIDEwMCUgYW5kIDk1JSBNQ1BzIHdlcmUgY2FsY3VsYXRlZCBiZXR3ZWVuIGJvdGggcG9wdWxhdGlvbnMuIApgYGB7ciBIb21lIHJhbmdlIHNpemVzIG9mIFN0b25lIENhbnlvbiBhbmQgT3dsIEhlYWQgQnV0dGVzIGJ5IHllYXIuLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KR01fdGFibGUgPC0gcmVhZF9jc3YoIkdNX3RhYmxlLmNzdiIpCmthYmxlKEdNX3RhYmxlLGZvcm1hdD0icGFuZG9jIiwgY2FwdGlvbj0nSG9tZSByYW5nZSBzaXplcyBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBoZWFkIEJ1dHRlcyB1c2luZyBib3RoIDk1IHBlcmNlbnQgYW5kIDEwMCBwZXJjZW50IE1DUHMuJykKYGBgCgoKCgo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+R2lsYSBNb25zdGVyIEhvbWUgUmFuZ2UgU2l6ZXMgYXQgU3RvbmUgQ2FueW9uIHZzLiBPd2wgSGVhZCBCdXR0ZXMuPC9zcGFuPgoKCmBgYHtyIFN0b25lIENhbnlvbiBWcy4gT3dsIEhlYWQgQnV0dGVzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQp5ZWFyIDwtIHJlYWRfY3N2KCJHTV9Db25zb2xpZGF0ZWRfQnlZZWFyLmNzdiIpCgojIHF1aWNrIHBsb3QKR3JhcGgxPC1nZ3Bsb3QoeWVhcixhZXMoeD1OMTAwLHk9SG9tZV9SYW5nZV8xMDBtY3AsZ3JvdXA9RW52aXJvbm1lbnQpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gMikrCiAgZ2VvbV9zbW9vdGgobWV0aG9kPWxtKSsKICAjIHNjYWxlX2NvbG91cl9tYW51YWwodmFsdWVzPWMoc3Vic2lkaXplZD0iY3lhbjMiLG5vbnN1YnNpZGl6ZWQ9ImluZGlhbiByZWQxIikpKwogICMgbGFicyh0aXRsZSA9ICIxMDAlIE1DUCBIb21lIFJhbmdlcyIpKwogIHhsYWIoIk51bWJlciBvZiBSZWxvY2F0aW9ucyIpKwogIHlsYWIoIkFyZWEgKGhhKSB1c2luZyAxMDAlIE1DUCIpKwogIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIsc2U9RkFMU0UpKwogIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgMiB8IE5vbi1TdWJzaWRpemVkIChPd2wgSGVhZCBCdXR0ZXMpIHZzLiBTdWJzaWRpemVkIChTdG9uZSBDYW55b24pIHBvcHVsYXRpb24gMTAwJSBNQ1BzIGFnYWluc3QgbnVtYmVyIFxuIG9mIGZpeGVzIG9mIHRoZSBjb21wbGV0ZSBkYXRhIHNldC4iKSsKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLGxpbmVoZWlnaHQgPSAwLjkpKQogICMgdGhlbWVfYncoKQoKR3JhcGgxPC1HcmFwaDErdGhlbWUoYXhpcy50aXRsZT1lbGVtZW50X3RleHQoc2l6ZSA9IDE0KSkKCiMgbGVnZW5kIGF0IHRvcC1sZWZ0LCBpbnNpZGUgdGhlIHBsb3QKU0NPSC5oci5maWc8LUdyYXBoMSArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLAogICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkKU0NPSC5oci5maWcKIyBkaXIuY3JlYXRlKCJvdXRwdXRzIikgIyBjcmVhdGUgYSBuZXcgZm9sZGVyIHRvIGhvbGQgdGhlIG91dHB1dCBmaWxlcwojIGdnc2F2ZSgib3V0cHV0cy9TQ19PSEJfcGxvdC5wZGYiKQpgYGAKCgoKCmBgYHtyIGV2YWw9RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGluY2x1ZGU9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQojIG1jcF9hbmFseXNpcyA8LSBmdW5jdGlvbihmaWxlbmFtZSwgcGVyY2VudGFnZSl7CiMgICBkYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSBmaWxlbmFtZSkKIyAgIHggPC0gYXMuZGF0YS5mcmFtZShkYXRhJEVBU1RJTkcpCiMgICB5IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSROT1JUSElORykKIyAgIHh5IDwtIGMoeCx5KQojICAgZGF0YS5wcm9qIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoeHksZGF0YSwgcHJvajRzdHJpbmcgPSBDUlMuU0MpCiMgICB4eSA8LSBTcGF0aWFsUG9pbnRzKGRhdGEucHJvakBjb29yZHMpCiMgICBtY3Aub3V0IDwtIG1jcCh4eSwgcGVyY2VudGFnZSwgdW5vdXQ9ImhhIikKIyAgIGFyZWEgPC0gYXMuZGF0YS5mcmFtZShyb3VuZChtY3Aub3V0QGRhdGEkYXJlYSw0KSkKIyAgIC5yb3dOYW1lc0RGKGFyZWEsIG1ha2UubmFtZXM9VFJVRSkgPC0gZGF0YSRZRUFSCiMgICB3cml0ZS50YWJsZShhcmVhLGZpbGU9Ik1DUF9IZWN0YXJlcy5jc3YiLAojICAgICAgICAgICAgICAgYXBwZW5kPVRSVUUsc2VwPSIsIiwgY29sLm5hbWVzPUZBTFNFLCByb3cubmFtZXM9VFJVRSkKIyAgIG1jcC5wb2ludHMgPC0gY2JpbmQoKGRhdGEuZnJhbWUoeHkpKSxkYXRhJFlFQVIpCiMgICBjb2xuYW1lcyhtY3AucG9pbnRzKSA8LSBjKCJ4IiwieSIsICJ5ZWFyIikKIyAgIG1jcC5wb2x5IDwtIGZvcnRpZnkobWNwLm91dCwgcmVnaW9uID0gImlkIikKIyAgIHVuaXRzIDwtIGdyaWQudGV4dChwYXN0ZShyb3VuZChtY3Aub3V0QGRhdGEkYXJlYSwyKSwiIGhhIiksIHg9MC45LCAgeT0wLjk1LAojICAgICAgICAgICAgICAgICAgICAgIGdwPWdwYXIoZm9udGZhY2U9NCwgY2V4PTAuOSksIGRyYXcgPSBGQUxTRSkKIyAgIG1jcC5wbG90IDwtIGdncGxvdCgpICsKIyAgICAgZ2VvbV9wb2x5Z29uKGRhdGE9bWNwLnBvbHksIGFlcyh4PW1jcC5wb2x5JGxvbmcsIHk9bWNwLnBvbHkkbGF0KSwgYWxwaGE9MC41KSArCiMgICAgIGdlb21fcG9pbnQoZGF0YT1tY3AucG9pbnRzLCBhZXMoeD14LCB5PXkpKSArIHRoZW1lX2J3KCkgKwojICAgICBsYWJzKHg9IkVhc3RpbmcgKG0pIiwgeT0iTm9ydGhpbmcgKG0pIiwgdGl0bGU9bWNwLnBvaW50cyR5ZWFyKSArCiMgICAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpKSArCiMgICAgIGFubm90YXRpb25fY3VzdG9tKHVuaXRzKQojICAgbWNwLnBsb3QKIyB9CgpgYGAKCgoKCgpUYWJsZSAyIHwgR3JvdXAgMTAwJSBNQ1AgaG9tZSByYW5nZSBtZWFucyBvZiByYXcgZGF0YSBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4LgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KbGlicmFyeShSbWlzYykKWVJfR1JQX01lYW5zIDwtIHN1bW1hcnlTRSh5ZWFyLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXB2YXJzPWMoIkVudmlyb25tZW50IiwiU2V4IiksbmEucm0gPSBUUlVFKQoKa2FibGUoWVJfR1JQX01lYW5zLCBmb3JtYXQgPSAicGFuZG9jIiwgCiAgICAgIGNhcHRpb24gPSAnR3JvdXAgTWVhbnMgb2YgT3ZlcmFsbCAxMDAlIE1DUCBIb21lIFJhbmdlcycpCmBgYAoKCgpUYWJsZSAzIHwgR3JvdXAgOTUlIE1DUCBob21lIHJhbmdlIG1lYW5zIG9mIHJhdyBkYXRhIG9mIFN0b25lIENhbnlvbiBhbmQgT3dsIEhlYWQgQnV0dGVzLiBHcm91cGVkIGJ5IGVudmlyb25tZW50IGFuZCBzZXguCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpZUl9HUlBfTWVhbnM5NSA8LSBzdW1tYXJ5U0UoeWVhciwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV85NW1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiLCJTZXgiKSxuYS5ybSA9IFRSVUUpCgprYWJsZShZUl9HUlBfTWVhbnM5NSwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnR3JvdXAgTWVhbnMgb2YgT3ZlcmFsbCA5NSUgTUNQIEhvbWUKICAgICAgUmFuZ2VzJykKYGBgCgoKCgoKCjxzcGFuIHN0eWxlPSJjb2xvcjpibHVlIj5HaWxhIE1vbnN0ZXIgWWVhcmx5IEhvbWUgUmFuZ2UgU2hpZnRzIG9mIDEwMCUgTUNQcy48L3NwYW4+CgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQpDUlMuU0M8LUNSUygiK3Byb2o9dXRtICt6b25lPTEyICtlbGxwcz1XR1M4NCArdW5pdHM9bSArbm9fZGVmcyIpCgptY3BfYW5hbHlzaXMuUE9MWSA8LSBmdW5jdGlvbihmaWxlbmFtZSwgcGVyY2VudGFnZSl7CiAgZGF0YSA8LSByZWFkLmNzdihmaWxlID0gZmlsZW5hbWUsc3RyaW5nc0FzRmFjdG9ycyA9IEZBTFNFKQogIGRhdGEuc3AgPC0gZGF0YVssIGMoIkxJWkFSRE5VTUJFUiIsICJFQVNUSU5HIiwgIk5PUlRISU5HIildCiAgY29vcmRpbmF0ZXMoZGF0YS5zcCkgPC0gYygiRUFTVElORyIsICJOT1JUSElORyIpCiAgcHJvajRzdHJpbmcoZGF0YS5zcCkgPC0gQ1JTLlNDCiAgbWNwX291dCA8LSBtY3AoZGF0YS5zcCwgcGVyY2VudGFnZSwgdW5vdXQ9ImhhIikKfQoKTTIxNV9tY3AuMTE8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvMjAxMSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMjE1X21jcC4xMjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTIxNS8yMDEyIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMDRfbWNwLjA4PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTA0LzIwMDggLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEwNF9tY3AuMDk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMDQvMjAwOSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDA4IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTE0X21jcC4xMTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC8yMDExIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLjEyPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0LzIwMTIgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuMDk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvMjAwOSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy8yMDEwIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMzdfbWNwLjExPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuMDk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvMjAwOSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC4xMDwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny8yMDEwIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLjExPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3LzIwMTEgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjE0N19tY3AuMTI8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvMjAxMiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLjA4PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvMjAwOSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLjExPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvMjAxMSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLjEyPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvMjAxMiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGNjZfbWNwLjA4PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvMjAwOCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGNjZfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvMjAwOSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGNjZfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTE5X21jcC4wODwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS8yMDA4IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5LzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExOV9tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNMTEyX21jcC4wNzwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi8yMDA3IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyLzIwMDkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9tY3AuMTA8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNNjlfbWNwLjA5PC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NNjkvMjAwOSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpNNjlfbWNwLjEwPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NNjkvMjAxMCAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKIyMgRm9ydGlmeSBtY3AgcG9seWdvbnMgZm9yIGdncGxvdDIgKllFQVIqOgpGMTA0X21jcC4wOFQgPC0gZm9ydGlmeShGMTA0X21jcC4wOCwgcmVnaW9uID0gImlkIikKRjEwNF9tY3AuMDlUIDwtIGZvcnRpZnkoRjEwNF9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLjA4VCA8LSBmb3J0aWZ5KEYxMTRfbWNwLjA4LCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC4wOVQgPC0gZm9ydGlmeShGMTE0X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjExNF9tY3AuMTBUIDwtIGZvcnRpZnkoRjExNF9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLjExVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLjExLCByZWdpb24gPSAiaWQiKQpGMTE0X21jcC4xMlQgPC0gZm9ydGlmeShGMTE0X21jcC4xMiwgcmVnaW9uID0gImlkIikKRjEzN19tY3AuMDlUIDwtIGZvcnRpZnkoRjEzN19tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLjEwVCA8LSBmb3J0aWZ5KEYxMzdfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpGMTM3X21jcC4xMVQgPC0gZm9ydGlmeShGMTM3X21jcC4xMSwgcmVnaW9uID0gImlkIikKRjE0N19tY3AuMDlUIDwtIGZvcnRpZnkoRjE0N19tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLjEwVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpGMTQ3X21jcC4xMVQgPC0gZm9ydGlmeShGMTQ3X21jcC4xMSwgcmVnaW9uID0gImlkIikKRjE0N19tY3AuMTJUIDwtIGZvcnRpZnkoRjE0N19tY3AuMTIsIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuMDhUIDwtIGZvcnRpZnkoRjM2X21jcC4wOCwgcmVnaW9uID0gImlkIikKRjM2X21jcC4wOVQgPC0gZm9ydGlmeShGMzZfbWNwLjA5LCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLjEwVCA8LSBmb3J0aWZ5KEYzNl9tY3AuMTAsIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuMTFUIDwtIGZvcnRpZnkoRjM2X21jcC4xMSwgcmVnaW9uID0gImlkIikKRjM2X21jcC4xMlQgPC0gZm9ydGlmeShGMzZfbWNwLjEyLCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLjA4VCA8LSBmb3J0aWZ5KEY2Nl9tY3AuMDgsIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuMDlUIDwtIGZvcnRpZnkoRjY2X21jcC4wOSwgcmVnaW9uID0gImlkIikKRjY2X21jcC4xMFQgPC0gZm9ydGlmeShGNjZfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpNMTE5X21jcC4wOFQgPC0gZm9ydGlmeShNMTE5X21jcC4wOCwgcmVnaW9uID0gImlkIikKTTExOV9tY3AuMDlUIDwtIGZvcnRpZnkoTTExOV9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCk0xMTlfbWNwLjEwVCA8LSBmb3J0aWZ5KE0xMTlfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpNMTEyX21jcC4wN1QgPC0gZm9ydGlmeShNMTEyX21jcC4wNywgcmVnaW9uID0gImlkIikKTTExMl9tY3AuMDlUIDwtIGZvcnRpZnkoTTExMl9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCk0xMTJfbWNwLjEwVCA8LSBmb3J0aWZ5KE0xMTJfbWNwLjEwLCByZWdpb24gPSAiaWQiKQpNNjlfbWNwLjA5VCA8LSBmb3J0aWZ5KE02OV9tY3AuMDksIHJlZ2lvbiA9ICJpZCIpCk02OV9tY3AuMTBUIDwtIGZvcnRpZnkoTTY5X21jcC4xMCwgcmVnaW9uID0gImlkIikKTTIxNV9tY3AuMTFUIDwtIGZvcnRpZnkoTTIxNV9tY3AuMTEsIHJlZ2lvbiA9ICJpZCIpCk0yMTVfbWNwLjEyVCA8LSBmb3J0aWZ5KE0yMTVfbWNwLjEyLCByZWdpb24gPSAiaWQiKQoKCm1jcC5zaGlmdC5URVNUNCA8LSBnZ3Bsb3QoKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEwNF9tY3AuMDhULCBhZXMoeD1GMTA0X21jcC4wOFQkbG9uZywgeT1GMTA0X21jcC4wOFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTA0X21jcC4wOVQsIGFlcyh4PUYxMDRfbWNwLjA5VCRsb25nLCB5PUYxMDRfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjA4VCwgYWVzKHg9RjExNF9tY3AuMDhUJGxvbmcsIHk9RjExNF9tY3AuMDhUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuMDlULCBhZXMoeD1GMTE0X21jcC4wOVQkbG9uZywgeT1GMTE0X21jcC4wOVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC4xMFQsIGFlcyh4PUYxMTRfbWNwLjEwVCRsb25nLCB5PUYxMTRfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLjExVCwgYWVzKHg9RjExNF9tY3AuMTFUJGxvbmcsIHk9RjExNF9tY3AuMTFUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjExNF9tY3AuMTJULCBhZXMoeD1GMTE0X21jcC4xMlQkbG9uZywgeT1GMTE0X21jcC4xMlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTM3X21jcC4wOVQsIGFlcyh4PUYxMzdfbWNwLjA5VCRsb25nLCB5PUYxMzdfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLjEwVCwgYWVzKHg9RjEzN19tY3AuMTBUJGxvbmcsIHk9RjEzN19tY3AuMTBUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuMTFULCBhZXMoeD1GMTM3X21jcC4xMVQkbG9uZywgeT1GMTM3X21jcC4xMVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC4wOVQsIGFlcyh4PUYxNDdfbWNwLjA5VCRsb25nLCB5PUYxNDdfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTEpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC4xMFQsIGFlcyh4PUYxNDdfbWNwLjEwVCRsb25nLCB5PUYxNDdfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTEpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC4xMVQsIGFlcyh4PUYxNDdfbWNwLjExVCRsb25nLCB5PUYxNDdfbWNwLjExVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTEpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC4xMlQsIGFlcyh4PUYxNDdfbWNwLjEyVCRsb25nLCB5PUYxNDdfbWNwLjEyVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTEpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjA4VCwgYWVzKHg9RjM2X21jcC4wOFQkbG9uZywgeT1GMzZfbWNwLjA4VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NikgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuMDlULCBhZXMoeD1GMzZfbWNwLjA5VCRsb25nLCB5PUYzNl9tY3AuMDlUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjM2X21jcC4xMFQsIGFlcyh4PUYzNl9tY3AuMTBUJGxvbmcsIHk9RjM2X21jcC4xMFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTYpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLjExVCwgYWVzKHg9RjM2X21jcC4xMVQkbG9uZywgeT1GMzZfbWNwLjExVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NikgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuMTJULCBhZXMoeD1GMzZfbWNwLjEyVCRsb25nLCB5PUYzNl9tY3AuMTJUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT02KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC4wOFQsIGFlcyh4PUY2Nl9tY3AuMDhUJGxvbmcsIHk9RjY2X21jcC4wOFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTEpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GNjZfbWNwLjA5VCwgYWVzKHg9RjY2X21jcC4wOVQkbG9uZywgeT1GNjZfbWNwLjA5VCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MSkgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuMTBULCBhZXMoeD1GNjZfbWNwLjEwVCRsb25nLCB5PUY2Nl9tY3AuMTBUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT0xKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExOV9tY3AuMDhULCBhZXMoeD1NMTE5X21jcC4wOFQkbG9uZywgeT1NMTE5X21jcC4wOFQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPU0xMTlfbWNwLjA5VCwgYWVzKHg9TTExOV9tY3AuMDlUJGxvbmcsIHk9TTExOV9tY3AuMDlUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1NMTE5X21jcC4xMFQsIGFlcyh4PU0xMTlfbWNwLjEwVCRsb25nLCB5PU0xMTlfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9TTExMl9tY3AuMDdULCBhZXMoeD1NMTEyX21jcC4wN1QkbG9uZywgeT1NMTEyX21jcC4wN1QkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPU0xMTJfbWNwLjA5VCwgYWVzKHg9TTExMl9tY3AuMDlUJGxvbmcsIHk9TTExMl9tY3AuMDlUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1NMTEyX21jcC4xMFQsIGFlcyh4PU0xMTJfbWNwLjEwVCRsb25nLCB5PU0xMTJfbWNwLjEwVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0zKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1NNjlfbWNwLjA5VCwgYWVzKHg9TTY5X21jcC4wOVQkbG9uZywgeT1NNjlfbWNwLjA5VCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIikgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9TTY5X21jcC4xMFQsIGFlcyh4PU02OV9tY3AuMTBUJGxvbmcsIHk9TTY5X21jcC4xMFQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIpICsKICAjIGdlb21fcG9seWdvbihkYXRhPU0yMTVfbWNwLjExVCwgYWVzKHg9TTIxNV9tY3AuMTFUJGxvbmcsIHk9TTIxNV9tY3AuMTFUJGxhdCksCiAgIyAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siKSArCiAgIyBnZW9tX3BvbHlnb24oZGF0YT1NMjE1X21jcC4xMlQsIGFlcyh4PU0yMTVfbWNwLjEyVCRsb25nLCB5PU0yMTVfbWNwLjEyVCRsYXQpLAogICMgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIikgKwogIHRoZW1lX2J3KCkgK2xhYnMoeD0iRWFzdGluZyAobSkiLCB5PSJOb3J0aGluZyAobSkiKSArCiAgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSA0ICB8ICBZZWFybHkgaG9tZSByYW5nZSBzaGlmdHMgb2Ygc3ViLXNhbXBsZWQgaG9tZSByYW5nZXMgb2YgOCBsaXphcmRzLCBib3RoIG1hbGVzIGFuZCBmZW1hbGVzLiBIb21lIFxuIHJhbmdlIHNoaWZ0cyBhcHBlYXIgdG8gYmUgcmVsYXRpdmxleSBzdGFibGUgb3ZlciBzdHVkeSB5ZWFycy4iKSsKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLGxpbmVoZWlnaHQgPSAwLjkpKQogICMgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSJub25lIiwgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChmYWNlID0gImJvbGQiLCBoanVzdCA9IDAuNSkpCgptY3Auc2hpZnQuVEVTVDQKYGBgCgoKCgoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPlJlcGVhdGVkIG1lYXN1cmVzIEFOT1ZBIGZvciBZZWFybHkgSG9tZSBSYW5nZXMuPC9zcGFuPgoKUmVwZWF0ZWQgTWVhc3VyZSBBTk9WQSBmb3IgMTAwJSBNQ1Agb3ZlcmFsbCBob21lIHJhbmdlcwpgYGB7ciBSZXBlYXRlZCBNZWFzdXJlcyBBTk9WQSBZRUFSLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyBHZXQgcC12YWx1ZXMgZnJvbSBtaXhlZCBtb2RlbCBGIHZhbHVlczoKbGlicmFyeShsbWU0KQpsaWJyYXJ5KHJlYWRyKQp5ZWFyIDwtIHJlYWRfY3N2KCJHTV9Db25zb2xpZGF0ZWRfQnlZZWFyLmNzdiIpCgpSTW1vZC55ZWFyPC1sbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1llYXIrU2V4K04xMDArRW52aXJvbm1lbnQqU2V4KwogICAgICAgICAgICAgICAgICAgKDF8R2lsYSksZGF0YSA9IHllYXIpCnN1bW1hcnkoUk1tb2QueWVhcikKYGBgCgoKQU5PVkEgVGFibGU6IDEwMCUgTUNQCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CmFub3ZhKFJNbW9kLnllYXIpCmBgYAoKClJlcGVhdGVkIE1lYXN1cmUgQU5PVkEgZm9yIDk1JSBNQ1Agb3ZlcmFsbCBob21lIHJhbmdlcwpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KUk1tb2QueWVhcjk1PC1sbWVyKEhvbWVfUmFuZ2VfOTVtY3B+RW52aXJvbm1lbnQrWWVhcitTZXgrTjEwMCtFbnZpcm9ubWVudCpTZXgrCiAgICAgICAgICAgICAgICAgICAoMXxHaWxhKSxkYXRhID0geWVhcikKc3VtbWFyeShSTW1vZC55ZWFyOTUpCmBgYAoKCkFOT1ZBIFRhYmxlOiA5NSUgTUNQCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQphbm92YShSTW1vZC55ZWFyOTUpCmBgYAoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCgogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClJNbW9kLnllYXIxMDA8LWxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrWWVhcitTZXgrTjEwMCtFbnZpcm9ubWVudCpTZXgrKDF8R2lsYSksZGF0YSA9IHllYXIpCgpSTS5tYXJnaW5hbCA8LSBsc21lYW5zKFJNbW9kLnllYXIxMDAsIAogICAgICAgICAgICAgICAgICAgIH4gRW52aXJvbm1lbnQpCiMgUk0ubWFyZ2luYWwKCiMjIENBVEFHT1JJWkUgTFNNIEdSQVBIIEJZIFNFWCBCRVRXRUVOIEVOVklST05NRU5UOgpyZWZSTV9zZXggPC0gbHNtZWFucyhSTW1vZC55ZWFyMTAwLCBzcGVjcyA9IGMoIkVudmlyb25tZW50IiwiU2V4IikpCgojIHJlZlJNX3NleApyZWZfZGZSTV9zZXggPC0gYXMuZGF0YS5mcmFtZShzdW1tYXJ5KHJlZlJNX3NleCkpCnBkX1JNIDwtIHBvc2l0aW9uX2RvZGdlKDAuMSkKCnlyLm1lYW4uYWRqPC1nZ3Bsb3QocmVmX2RmUk1fc2V4LCBhZXMoeD1TZXgseT1sc21lYW4sZ3JvdXA9RW52aXJvbm1lbnQpKSsKICBnZW9tX3BvaW50KGFlcyhzaGFwZSA9IGZhY3RvcihFbnZpcm9ubWVudCkpLCBzaXplID0gMixwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSguMSksIAogICAgICAgICAgICBzaG93LmxlZ2VuZCA9IEZBTFNFKSsKICBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPWxzbWVhbi1TRSwgeW1heD1sc21lYW4rU0UpLCB3aWR0aD0uMSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAjIGdndGl0bGUoIkFkanVzdGVkIEhvbWUgUmFuZ2VzIGJ5IFNleCBhbmQgUG9wdWxhdGlvbiAoMTAwJSBNQ1ApIikrCiAgeGxhYigiU2V4IikrCiAgeWxhYigiIikKICAjIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgNSAgfCAgQWRqdXN0ZWQgaG9tZSByYW5nZXMgdXNpbmcgMTAwJSBNQ1BzIGJldHdlZW4gc2V4ZXMgb2Ygbm9uLXN1YnNpZGl6ZWQgYW5kIHN1YnNpZGl6ZWQgcG9wdWxhdGlvbnMuIFxuIEFkanVzdGVkIGZvciBlbnZpcm9ubWVudCwgeWVhciwgc2V4LCBhbmQgc2FtcGxlIHNpemUuIE1hbGUgaG9tZSByYW5nZXMgcmVtYWluZWQgc21hbGxlciB0aGFuIHRob3NlIG9mIGZlbWFsZXMgYXQgXG4gT3dsIEhlYWQgQnV0dGVzLiIpKwogICMgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkKICAjIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGNvbG9yPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSkKCiMgeXIubWVhbi5hZGo8LXlyLm1lYW4uYWRqICsgdGhlbWUobGVnZW5kLnRpdGxlID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5qdXN0aWZpY2F0aW9uPWMoMCwxKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYmFja2dyb3VuZCA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQua2V5ID0gZWxlbWVudF9ibGFuaygpLAojICAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkKIyB5ci5tZWFuLmFkagojIHJtKExTTS5ZZWFySFIpCgpwZF9STSA8LSBwb3NpdGlvbl9kb2RnZSgwLjEpCgpSYXcuWWVhckhSPC1nZ3Bsb3QoWVJfR1JQX01lYW5zLCBhZXMoeD1TZXgseT1Ib21lX1JhbmdlXzEwMG1jcCxncm91cD1FbnZpcm9ubWVudCkpKwogIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZmFjdG9yKEVudmlyb25tZW50KSksIHNpemUgPSAyLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC4xKSkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1Ib21lX1JhbmdlXzEwMG1jcC1zZSwgeW1heD1Ib21lX1JhbmdlXzEwMG1jcCtzZSksCiAgICAgICAgICAgICAgICB3aWR0aD0uMSxwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpKSsKICAjIGdndGl0bGUoIk92ZXJhbGwgSG9tZSBSYW5nZXMgYnkgU2V4IGFuZCBQb3B1bGF0aW9uICgxMDAlIE1DUCkiKSsKICB4bGFiKCJTZXgiKSsKICB5bGFiKCIxMDAlIE1DUCBBcmVhIChoYSkiKQogICMgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpKQogICMgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSAzIHwgUmF3IG92ZXJhbGwgbWVhbiBob21lIHJhbmdlcyBiZXR3ZWVuIGVudmlyb25tZW50IGFuZCBzZXggdXNpbmcgMTAwJSBNQ1BzLiBOb3RlLCB0aGF0IGJlZm9yZSBhZGp1c3RlZCBcbiBob21lIHJhbmdlcywgbWFsZXMgZXhoaWJpdCBzbWFsbGVyIG92ZXJhbGwgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uLCB0aGFuIG1hbGVzIG9mIE93bCBIZWFkIEJ1dHRlcy4iKSsKICAjIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpCgp5ci5tZWFuLnJhdzwtUmF3LlllYXJIUiArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkKIyB5ci5tZWFuLnJhdwoKbGlicmFyeShncmlkRXh0cmEpCmxpYnJhcnkoZ3JpZCkKCmdyaWQuYXJyYW5nZSh5ci5tZWFuLnJhdywgeXIubWVhbi5hZGosIG5yb3cgPSAxLCAgCiAgICAgICAgICAgICBib3R0b20gPSB0ZXh0R3JvYigiRmlndXJlIHggfCBhLiBSYXcgZ3JvdXAgbWVhbnMgb2Ygb3ZlcmFsbCB5ZWFybHkgaG9tZSByYW5nZXMgYmV0d2VlbiBtYWxlcyBhbmQgZmVtYWxlcy4gTm90ZSB0aGF0IHRoZSBtYWxlIFxuIGhvbWUgcmFuZ2Ugb2YgdGhlIHN1YnNpZGl6ZWQgcG9wdWxhdGlvbiBpcyBzbWFsbGVyIHRoYW4gdGhhdCBvZiB0aGUgZmVtYWxlIGhvbWUgcmFuZ2UgaW4gdGhlIG5vbi1zdWJzaWRpemVkIFxuIHBvcHVsYXRpb24uIGIuIEdyb3VwIG1lYW5zIG9mIGhvbWUgcmFuZ2VzIGFmdGVyIGJlaW5nIGFkanVzdGVkIGZvciBlbnZpcm9ubWVudCwgeWVhciwgc2V4LCBhbmQgc2FtcGxlIHNpemUuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250ZmFjZSA9IDEsZm9udHNpemUgPSAxMCksaGp1c3QgPSAwLCB4ID0gMCkpCmBgYAoKCgoKClRhYmxlIDQuIERpcmVjdGlvbmFsIG1lYW5zIG9mIGhvbWUgcmFuZ2UgYWZ0ZXIgYmVpbmcgYWRqdXN0ZWQgZm9yIHllYXIsIHNleCBhbmQgc2FtcGxlIHNpemUuCmBgYHtyIGVjaG89RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQprYWJsZShyZWZfZGZSTV9zZXgsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ0FkanVzdGVkIEdyb3VwIE1lYW5zIG9mIE92ZXJhbGwgSG9tZSAgIFJhbmdlcycpCmBgYAoKIAogICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgClBvc3QtSG9jIGNvbXBhcmlzb25zIGJldHdlZW4gc2V4ZXMgYW5kIGVudmlyb25tZW50OgpgYGB7ciBDb21wcyBmb3IgU2V4LCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KUk1tb2QueWVhci5FbTwtbG1lcihIb21lX1JhbmdlXzEwMG1jcH5FbnZpcm9ubWVudCtZZWFyK1NleCtOMTAwK0Vudmlyb25tZW50KlNleCsKICAgICAgICAgICAgICAgICAgICAgICgxfEdpbGEpLGRhdGEgPSB5ZWFyKQoKIyBTZXguZW1tLm9hIDwtIGVtbWVhbnMoUk1tb2QueWVhci5FbSwgYygiRW52aXJvbm1lbnQiLCJTZXgiKSkKIyBwYWlycyhTZXguZW1tLm9hKQoKZW1tX3MudDIgPC0gZW1tZWFucyhSTW1vZC55ZWFyLkVtLCBwYWlyd2lzZSB+IFNleCB8IEVudmlyb25tZW50KQplbW1fcy50MgpgYGAKCgoKR3JhcGhpY2FsIENvbXBhcmlzb25zIG9mIFNleCBXaXRoaW4gRWFjaCBFbnZpcm9ubWVudDoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnBsb3QoZW1tX3MudDIsIGNvbXBhcmlzb25zID0gVFJVRSwgeGxhYiA9ICJMZWFzdCBTcXVhcmUgTWVhbiAoaGEpIiwgeWxhYiA9ICJFbnZpcm9ubWVudCIpCmBgYApGaWd1cmUgNiB8IFBhaXJ3aXNlIGNvbXBhcmlzb25zIG9mIGhvbWUgcmFuZ2UgYmV0d2VlbiBzZXhlcyB3aXRoaW4gZWFjaCBlbnZpcm9ubWVudC4gSWYgcmVkIGFycm93cyBvdmVybGFwIHRob3NlIG9mIG90aGVycywgdGhlbiAgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgc3RhdGlzdGljYWwgZGlmZmVyZW5jZS4gCgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KZW1tX3MudDMgPC0gZW1tZWFucyhSTW1vZC55ZWFyLkVtLCBwYWlyd2lzZSB+IEVudmlyb25tZW50IHwgU2V4KQplbW1fcy50MwpgYGAKCgoKR3JhcGhpY2FsIENvbXBhcmlzb25zIG9mIFNleCBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnM6CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpwbG90KGVtbV9zLnQzLCBjb21wYXJpc29ucyA9IFRSVUUsIHhsYWIgPSAiTGVhc3QgU3F1YXJlIE1lYW4gKGhhKSIsIHlsYWIgPSAiRW52aXJvbm1lbnQiKQpgYGAKRmlndXJlIDcgfCBQYWl3aXNlIGNvbXBhcmlzb25zIG9mIHNleCBiZXR3ZWVuIGVudmlyb25tZW50cy4gSWYgcmVkIGFycm93cyBvdmVybGFwIHRob3NlIG9mIG90aGVycywgdGhlbiAgdGhlcmUgaXMgbm8gc2lnbmlmaWNhbnQgc3RhdGlzdGljYWwgZGlmZmVyZW5jZS4gCiAKIAogCiAKIAogCkF0IFN0b25lIENhbnlvbiwgbWFsZSB5ZWFybHkgaG9tZSByYW5nZXMgcmFuZ2VkIGZyb20gMS45MSAtIDI1LjEgaGEsIHdpdGggYSBtZWFuIG9mIDExLjcgwrEgMS43IFMuRS4gaGEgKDEwMCUgTUNQKSwgOS4xIMKxIDEuMyBTLkUuIEhhICg5NSUgTUNQKS4gRmVtYWxlIGhvbWUgcmFuZ2VzIHJhbmdlZCBmcm9tIDIuMDYg4oCTIDM4LjgxIGhhIGFuZCBhIG1lYW4gb2YgOS44IMKxIDEuMSBTLkUuIGhhICgxMDAlIE1DUCksIDcuMSDCsSAwLjcxIFMuRS4gaGEgKDk1JSBNQ1ApLiBNYWxlIEdpbGEgTW9uc3RlcnMgYXQgT3dsIGhlYWQgQnV0dGVzIGhhZCBob21lIHJhbmdlcyB0aGF0IHJhbmdlZCBmcm9tIDEwLjYg4oCTIDgyLjcgaGEgd2l0aCBhIG1lYW4gb2YgNDMuMiDCsSA1LjcgUy5FLiBoYSAoMTAwJSBNQ1ApLCA0MS45IMKxIDQuOSBTLkUuIGhhICg5NSUgTUNQKS4gRmVtYWxlIGhvbWUgcmFuZ2VzIHJhbmdlZCBmcm9tIDcuMSDigJMgNDcuNiB3aXRoIGEgbWVhbiBvZiAyMi4wIMKxIDMuNyBTLkUuIGhhICgxMDAlIE1DUCksIDIwLjYgwrEgMi41IFMuRS4gaGEgKDk1JSBNQ1ApLiBJbiB0aGUgYW5hbHlzZXMgb2YgYm90aCBwb3B1bGF0aW9ucywgeWVhciBoYWQgbm8gZWZmZWN0IG9uIGhvbWUgcmFuZ2Ugc2l6ZXMgKEYgPSAwLjUwLCBQID0gMC40OCksIHdoaWxlIHRoZXJlIHdhcyBhIGRldGVjdGVkIHNpZ25pZmljYW50IGRpZmZlcmVuY2UgaW4gaG9tZSByYW5nZXMgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zIChGID0gOC44NiwgUCA9IDAuMDAzKSwgYXMgd2VsbCBhcyBzZXggKEYgPSAxNS43NSwgUCA9IDAuMDAwNCkuIFBvc3QtSG9jIGFuYWx5c2VzIGJldHdlZW4gc2V4ZXMgaW5kaWNhdGVkIHRoYXQgdGhlcmUgd2FzIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBtYWxlIGhvbWUgcmFuZ2VzIGJldHdlZW4gdGhlIHR3byBlbnZpcm9ubWVudHMgKGRmID0gNzAuNCwgUCA9IDAuMDAwNykuIFRoZXJlIHdhcyBhIHNsaWdodCBkaWZmZXJlbmNlIG9mIGZlbWFsZSBob21lIHJhbmdlcyBiZXR3ZWVuIHRoZSB0d28gZW52aXJvbm1lbnRzLCBob3dldmVyIGl0IHdhcyBub3Qgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAoZGYgPSA2OC45LCBQID0gMC4wNikuIEF0IHN0b25lIGNhbnlvbiB0aGVyZSB3YXMgbm8gbWFqb3IgZGlmZmVyZW5jZSBiZXR3ZWVuIG1hbGUgYW5kIGZlbWFsZSBob21lIHJhbmdlcyAoZGYgPSAzNi45LCBQID0gMC4yMykgd2l0aCBtYWxlIGhvbWUgcmFuZ2UgYmVpbmcgb25seSAzJSBsYXJnZXIgdGhhbiBmZW1hbGVzLiBNYWxlcyBhdCBPd2wgSGVhZCBCdXR0ZXMgaGFkIGEgNjUlIGxhcmdlciBob21lIHJhbmdlIHRoYW4gZGlkIGZlbWFsZXMsIGFuZCB3YXMgc3RhdGlzdGljYWxseSBzaWduaWZpY2FudCAoZGYgPSAzMS4zLCBQID0gMC4wMDAzKS4gSW50ZXJlc3RpbmdseSwgbWFsZXMgYXQgU3RvbmUgQ2FueW9uIGhhZCBzbWFsbGVyIGhvbWUgcmFuZ2VzIHRoYW4gZGlkIHRoZSBmZW1hbGVzIGF0IE93bCBIZWFkIEJ1dHRlcyAoVGFibGUgeCkgV2hlbiB1c2luZyA5NSUgTUNQcywgbWFsZSBob21lIHJhbmdlcyByZWR1Y2VkIGJ5IDI1JSBhbmQgZmVtYWxlIHJhbmdlIGJ5IDMxJS4gQXQgT3dsIEhlYWQgQnV0dGVzLCBHaWxhIE1vbnN0ZXJzIHNob3dlZCBhIHNpbWlsYXIgYmVoYXZpb3Igd2l0aCBtYWxlIGhvbWUgcmFuZ2VzIHJlZHVjZWQgYnkgMjAlIGFuZCBmZW1hbGUgcmFuZ2VzIHJlZHVjZWQgYnkgMjYlIHVzaW5nIDk1JSBNQ1BzLiAKICAKIAogCiAKCiAKIAojIyBPdmVyYWxsIFllYXJseSBIb21lIFJhbmdlcyAoS0RFKQoKCkhvbWUgcmFuZ2UgZXN0aW1hdGlvbiBvbiB0aGUgU3RvbmUgQ2FueW9uIEdpbGEgTW9uc3RlcnMgdXNpbmcgOTUlIEtERXMgd2l0aCBocmVmIGJhbmR3aWR0aCBwcm9kdWNlZCBtYWxlIGhvbWUgcmFuZ2VzIHJhbmdpbmcgZnJvbSAxNC41MiDigJMgNTUuMjUgaGEgd2l0aCBhIG1lYW4gb2YgMzMuOSDCsSAzLjI3IFMuRS4gaGEuIEZlbWFsZSBob21lIHJhbmdlcyByYW5nZWQgZnJvbSAxMC4wOSDigJMgNDcuNzcgaGEgd2l0aCBhIG1lYW4gb2YgMjMuMDYgwrEgMS44NiBTLkUuIEtERSBlc3RpbWF0ZXMgZm9yIG1hbGUgYW5kIGZlbWFsZSBob21lIHJhbmdlcyB3ZXJlIDk2JSBhbmQgODAlIGxhcmdlciB0aGFuIE1DUCBlc3RpbWF0ZXMuIFJlcGVhdGVkIE1lYXN1cmVzIGFuYWx5c2lzIG9mIEtERXMgc3VnZ2VzdGVkIHRoYXQgdGhlcmUgd2FzIGEgc21hbGwgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIG1hbGUgYW5kIGZlbWFsZSBob21lIHJhbmdlcyBhdCBTdG9uZSBDYW55b24gKEYgPSA0LjUyLCBQID0gMC4wNCkuIFllYXIgZGlkIG5vdCBoYXZlIGFuIGVmZmVjdCBvbiBob21lIHJhbmdlcyAoRiA9IDAuNjcsIFAgPSAwLjQxKS4gCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQp5ZWFyLmtkZTwtcmVhZF9jc3YoJ3llYXJseSBrZGUgdGFibGUuY3N2JykKa2FibGUoeWVhci5rZGUsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1llYXJseSBLREUgSG9tZSBSYW5nZXMnKQpgYGAKCgoKCgoKVGFibGUgIHwgUmF3IEdyb3VwIDk1JSBLREUgaG9tZSByYW5nZSBtZWFucyBvZiBTdG9uZSBDYW55b24gYW5kIE93bCBIZWFkIEJ1dHRlcy4gR3JvdXBlZCBieSBlbnZpcm9ubWVudCBhbmQgc2V4LgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0Kc3ViIDwtIHN1YnNldCh5ZWFyLCBFbnZpcm9ubWVudCA9PSAic3Vic2lkaXplZCIpCgpZUl9HUlBfTWVhbnMuS0RFIDwtIHN1bW1hcnlTRShzdWIsIG1lYXN1cmV2YXI9IkhvbWVfUmFuZ2VfOTVrZGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXB2YXJzPWMoIlNleCIpLG5hLnJtID0gVFJVRSkKCmthYmxlKFlSX0dSUF9NZWFucy5LREUsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1JhdyBHcm91cCBNZWFucyBvZiBPdmVyYWxsIDk1JSBLREUgSG9tZQogICAgICBSYW5nZXMnKQpgYGAKIAoKCiAKIAogCiAKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPlJlcGVhdGVkIG1lYXN1cmVzIEFOT1ZBIGZvciBLREUgSG9tZSBSYW5nZXMuPC9zcGFuPgoKUmVwZWF0ZWQgTWVhc3VyZSBBTk9WQSBmb3IgOTUlIEtERSBvdmVyYWxsIGhvbWUgcmFuZ2VzCmBgYHtyIFJlcGVhdGVkIE1lYXN1cmVzIEFOT1ZBIEtERSwgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMgR2V0IHAtdmFsdWVzIGZyb20gbWl4ZWQgbW9kZWwgRiB2YWx1ZXM6CgpSTS5LREVtb2QueWVhcjwtbG1lcihIb21lX1JhbmdlXzk1a2RlflllYXIrU2V4K04rKDF8R2lsYSksZGF0YSA9IHN1YikKCnN1bW1hcnkoUk0uS0RFbW9kLnllYXIpCmBgYAogCkFOT1ZBIFRhYmxlIGZvciA5NSUgS0RFIChzdWJzaWRpemVkKQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KYW5vdmEoUk0uS0RFbW9kLnllYXIpCmBgYAoKICAKIAogCiAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CgpSYXcuS0RFLkhSPC1nZ3Bsb3QoWVJfR1JQX01lYW5zLktERSwgYWVzKHg9U2V4LHk9SG9tZV9SYW5nZV85NWtkZSkpKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC4xKSkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1Ib21lX1JhbmdlXzk1a2RlLXNlLCB5bWF4PUhvbWVfUmFuZ2VfOTVrZGUrc2UpLAogICAgICAgICAgICAgICAgd2lkdGg9LjEscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgIyBnZ3RpdGxlKCJPdmVyYWxsIEhvbWUgUmFuZ2VzIGJ5IFNleCBhbmQgUG9wdWxhdGlvbiAoMTAwJSBNQ1ApIikrCiAgeGxhYigiU2V4IikrCiAgeWxhYigiOTUlIEtERSBBcmVhIChoYSkiKSsKICAgIyBsYWJzKGNhcHRpb24gPSAiRmlndXJlIDggIHwgIFJhdyA5NSUgS0RFIGhvbWUgcmFuZ2VzIGJldHdlZW4gbWFsZSBhbmQgZmVtYWxlIGhvbWUgcmFuZ2VzIGF0IFN0b25lIENhbnlvbi4iKSsKICB0aGVtZShwbG90LmNhcHRpb24gPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLGxpbmVoZWlnaHQgPSAwLjkpKQogICMgdGhlbWUocGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0xNCwgZmFjZT0iYm9sZCIpKQoKUmF3LktERS5IUjwtUmF3LktERS5IUiArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmp1c3RpZmljYXRpb249YygwLDEpLAogICAgICAgICAgICAgICAgICAgICBsZWdlbmQucG9zaXRpb249YygwLjA1LCAwLjk1KSwKICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5rZXkgPSBlbGVtZW50X2JsYW5rKCksCiAgICAgICAgICAgICAgICAgICAgIGxlZ2VuZC5ib3guYmFja2dyb3VuZCA9IGVsZW1lbnRfcmVjdChjb2xvdXIgPSAiYmxhY2siKSkKIyBSYXcuS0RFLkhSCgpSTS5LREVtb2QueWVhcjwtbG1lcihIb21lX1JhbmdlXzk1a2RlflllYXIrU2V4K04rKDF8R2lsYSksZGF0YSA9IHN1YikKCktERS5tYXJnaW5hbCA8LSBsc21lYW5zKFJNLktERW1vZC55ZWFyLCAKICAgICAgICAgICAgICAgICAgICB+IFNleCkKIyBSTS5tYXJnaW5hbAoKIyMgQ0FUQUdPUklaRSBMU00gR1JBUEggQlkgU0VYIEJFVFdFRU4gRU5WSVJPTk1FTlQ6CnJlZlJNX0tERSA8LSBsc21lYW5zKFJNLktERW1vZC55ZWFyLCBzcGVjcyA9IGMoIlNleCIpKQoKIyByZWZSTV9zZXgKcmVmX2RmUk1fS0RFIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShyZWZSTV9LREUpKQpwZF9STSA8LSBwb3NpdGlvbl9kb2RnZSgwLjEpCgpMU00uS0RFLkhSPC1nZ3Bsb3QocmVmX2RmUk1fS0RFLCBhZXMoeD1TZXgseT1sc21lYW4pKSsKICBnZW9tX3BvaW50KHNpemUgPSAyLHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKC4xKSkrCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sc21lYW4tU0UsIHltYXg9bHNtZWFuK1NFKSwgd2lkdGg9LjEscG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkrCiAgIyBnZ3RpdGxlKCJBZGp1c3RlZCBIb21lIFJhbmdlcyBieSBTZXggYW5kIFBvcHVsYXRpb24gKDEwMCUgTUNQKSIpKwogIHhsYWIoIlNleCIpKwogIHlsYWIoIiIpCiAgIyBsYWJzKGNhcHRpb24gPSAiRmlndXJlIDggIHwgIEFkanVzdGVkIDk1JSBLREUgaG9tZSByYW5nZXMgYmV0d2VlbiBtYWxlIGFuZCBmZW1hbCBob21lIHJhbmdlcyBhdCBTdG9uZSBDYW55b24uIEFkanVzdGVkIG9uIHllYXIsIFxuIHNleCwgYW5kIHNhbXBsZSBzaXplLiIpKwogICMgdGhlbWUocGxvdC5jYXB0aW9uID0gZWxlbWVudF90ZXh0KGhqdXN0ID0gMCxsaW5laGVpZ2h0ID0gMC45KSkKICAjIHRoZW1lKHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoaGp1c3QgPSAwLjUsIGNvbG9yPSJibGFjayIsIHNpemU9MTQsIGZhY2U9ImJvbGQiKSkKCiMgTFNNLktERS5IUjwtTFNNLktERS5IUiArIHRoZW1lKGxlZ2VuZC50aXRsZSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDAsMSksCiMgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uPWMoMC4wNSwgMC45NSksCiMgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X2JsYW5rKCksCiMgICAgICAgICAgICAgICAgICAgICAgbGVnZW5kLmtleSA9IGVsZW1lbnRfYmxhbmsoKSwKIyAgICAgICAgICAgICAgICAgICAgICBsZWdlbmQuYm94LmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIikpCiMgTFNNLktERS5IUgoKZ3JpZC5hcnJhbmdlKFJhdy5LREUuSFIsIExTTS5LREUuSFIsIG5yb3cgPSAxLCAgCiAgICAgICAgICAgICBib3R0b20gPSB0ZXh0R3JvYigiRmlndXJlIHggfCBhLiBSYXcgZ3JvdXAgbWVhbnMgb2Ygb3ZlcmFsbCB5ZWFybHkgS0RFcyBiZXR3ZWVuIG1hbGVzIGFuZCBmZW1hbGVzIGF0IFN0b25lIENhbnlvbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3AgPSBncGFyKGZvbnRmYWNlID0gMSxmb250c2l6ZSA9IDEwKSxoanVzdCA9IDAsIHggPSAwKSkKYGBgCgogCiAKIApUYWJsZSAgfCBEaXJlY3Rpb25hbCBtZWFucyBvZiBLREUgaG9tZSByYW5nZXMgYWZ0ZXIgYmVpbmcgYWRqdXN0ZWQgZm9yIHllYXIsIHNleCBhbmQgc2FtcGxlIHNpemUuCmBgYHtyIGVjaG89RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQprYWJsZShyZWZfZGZSTV9LREUsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ0FkanVzdGVkIEtERSBHcm91cCBNZWFucyBvZiBPdmVyYWxsIEhvbWUgUmFuZ2VzJykKYGBgCiAKIAoKCgoKIAogCiAKIAojIFNlYXNvbmFsIEhvbWUgUmFuZ2UKIAo8c3BhbiBzdHlsZT0iY29sb3I6Ymx1ZSI+U2Vhc29uYWwgSG9tZSBSYW5nZS48L3NwYW4+CgoKSG9tZSByYW5nZSBhbmFseXNpcyBicm9rZW4gZG93biBieSBmaXZlIHNlYXNvbnM7IEVtZXJnZW5jZSwgRHJ5LCBNb25zb29uLCBQb3N0IE1vbnNvb24uIFRoZSBzdGFydCBvZiBlbWVyZ2VuY2Ugd2FzIGRlZmluZWQgYnkgd2hlbiBtb3ZlbWVudCBwYXR0ZXJucyBpbmNyZWFzZWQgZnJvbSBub25lL21pbmltYWwgdG8gdGhlIHN0YXJ0IG9mIGhpZ2ggYWN0aXZpdHkuIEVmZm9ydCB3YXMgdGFrZW4gdG8gbWF0Y2ggYXMgY2xvc2VseSBhcyBwb3NzaWJsZSB0byB0aGUgT3dsIEhlYWQgQnV0dGVzIGVtZXJnZW5jZSBkYXRlIGludGVydmFsLiBNb25zb29uIHNlYXNvbiB3YXMgYWRqdXN0ZWQgdXNpbmcgTk9BQSBjbGltYXRlIGRhdGEuIFRoZSBzdGFydCBvZiB3YXMgZGVmaW5lZCB3aGVuIHRoZSBtZWFuIGRldyBwb2ludCB0ZW1wZXJhdHVyZXMgb2YgdGhyZWUgY29uc2VjdXRpdmUgZGF5cyB3ZXJlIGdyZWF0ZXIgdGhhbiA1NSBkZWdyZWVzLiAKClNjYWxpbmcgaG9tZSByYW5nZSBhbmFseXNlcyBieSBzZWFzb25hbCBlc3RpbWF0ZXMgcmVkdWNlcyB0aGUgbnVtYmVyIG9yIGxvY2F0aW9ucyBmb3IgZWFjaCBsaXphcmQuIDEwMCUgTUNQcyB3ZXJlIHVzZWQgZm9yIHNlYXNvbmFsIGhvbWUgcmFuZ2UgYW5hbHlzZXMgdG8gYXZvaWQgYW55IGZ1cnRoZXIgcmVkdWN0aW9uIG9mIGxvY2F0aW9ucyBmb3IgZWFjaCBlc3RpbWF0aW9uLgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQojIyBDcmVhdGUgTUNQIHBvbHlnb25zIGJ5IFNFQVNPTjoKTTIxNV9tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL00yMTUvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0yMTVfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTIxNS9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTIxNV9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMjE1L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCk0xMTJfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExMi9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTEyL01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKTTExMl9tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTIvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpNMTE5X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL00xMTkvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vTTExOS9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCk0xMTlfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9NMTE5L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjExNF9tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjExNC9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTE0L01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjExNF9tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMTQvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGMTM3X21jcC5FTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy9FbWVyZ2VuY2UgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTM3L0RyeSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC5NT048LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxMzcvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTM3X21jcC5QTTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjEzNy9Qb3N0X01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKCkYxNDdfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3L0VtZXJnZW5jZSAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X21jcC5EUlk8LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YxNDcvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLk1PTjwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjE0Ny9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYxNDdfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMTQ3L1Bvc3RfTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQoKRjI1Ml9tY3AuRU08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YyNTIvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYyNTJfbWNwLkRSWTwtbWNwX2FuYWx5c2lzLlBPTFkoIi4vRjI1Mi9EcnkgLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjI1Ml9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMjUyL01vbnNvb24gLmNzdiIsIHBlcmNlbnRhZ2U9IDEwMCkKRjI1Ml9tY3AuUE08LW1jcF9hbmFseXNpcy5QT0xZKCIuL0YyNTIvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGMzZfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYzNl9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkYzNl9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGMzZfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GMzYvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgpGNjZfbWNwLkVNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvRW1lcmdlbmNlIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkY2Nl9tY3AuRFJZPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvRHJ5IC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCkY2Nl9tY3AuTU9OPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvTW9uc29vbiAuY3N2IiwgcGVyY2VudGFnZT0gMTAwKQpGNjZfbWNwLlBNPC1tY3BfYW5hbHlzaXMuUE9MWSgiLi9GNjYvUG9zdF9Nb25zb29uIC5jc3YiLCBwZXJjZW50YWdlPSAxMDApCgojIyBGb3J0aWZ5IG1jcCBwb2x5Z29ucyBmb3IgZ2dwbG90MiAqU0VBU09OKjoKTTIxNV9tY3AuRU1UIDwtIGZvcnRpZnkoTTIxNV9tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCk0yMTVfbWNwLkRSWVQgPC0gZm9ydGlmeShNMjE1X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCk0yMTVfbWNwLk1PTlQgPC0gZm9ydGlmeShNMjE1X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCgpNMTEyX21jcC5EUllUIDwtIGZvcnRpZnkoTTExMl9tY3AuRFJZLCByZWdpb24gPSAiaWQiKQpNMTEyX21jcC5NT05UIDwtIGZvcnRpZnkoTTExMl9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpNMTEyX21jcC5QTVQgPC0gZm9ydGlmeShNMTEyX21jcC5QTSwgcmVnaW9uID0gImlkIikKCk0xMTlfbWNwLkRSWVQgPC0gZm9ydGlmeShNMTE5X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCk0xMTlfbWNwLk1PTlQgPC0gZm9ydGlmeShNMTE5X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCk0xMTlfbWNwLlBNVCA8LSBmb3J0aWZ5KE0xMTlfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjExNF9tY3AuRU1UIDwtIGZvcnRpZnkoRjExNF9tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLkRSWVQgPC0gZm9ydGlmeShGMTE0X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLk1PTlQgPC0gZm9ydGlmeShGMTE0X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYxMTRfbWNwLlBNVCA8LSBmb3J0aWZ5KEYxMTRfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjEzN19tY3AuRU1UIDwtIGZvcnRpZnkoRjEzN19tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLkRSWVQgPC0gZm9ydGlmeShGMTM3X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLk1PTlQgPC0gZm9ydGlmeShGMTM3X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYxMzdfbWNwLlBNVCA8LSBmb3J0aWZ5KEYxMzdfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjE0N19tY3AuRU1UIDwtIGZvcnRpZnkoRjE0N19tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLkRSWVQgPC0gZm9ydGlmeShGMTQ3X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLk1PTlQgPC0gZm9ydGlmeShGMTQ3X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYxNDdfbWNwLlBNVCA8LSBmb3J0aWZ5KEYxNDdfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjI1Ml9tY3AuRU1UIDwtIGZvcnRpZnkoRjI1Ml9tY3AuRU0sIHJlZ2lvbiA9ICJpZCIpCkYyNTJfbWNwLkRSWVQgPC0gZm9ydGlmeShGMjUyX21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkYyNTJfbWNwLk1PTlQgPC0gZm9ydGlmeShGMjUyX21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYyNTJfbWNwLlBNVCA8LSBmb3J0aWZ5KEYyNTJfbWNwLlBNLCByZWdpb24gPSAiaWQiKQoKRjM2X21jcC5FTVQgPC0gZm9ydGlmeShGMzZfbWNwLkVNLCByZWdpb24gPSAiaWQiKQpGMzZfbWNwLkRSWVQgPC0gZm9ydGlmeShGMzZfbWNwLkRSWSwgcmVnaW9uID0gImlkIikKRjM2X21jcC5NT05UIDwtIGZvcnRpZnkoRjM2X21jcC5NT04sIHJlZ2lvbiA9ICJpZCIpCkYzNl9tY3AuUE1UIDwtIGZvcnRpZnkoRjM2X21jcC5QTSwgcmVnaW9uID0gImlkIikKCkY2Nl9tY3AuRU1UIDwtIGZvcnRpZnkoRjY2X21jcC5FTSwgcmVnaW9uID0gImlkIikKRjY2X21jcC5EUllUIDwtIGZvcnRpZnkoRjY2X21jcC5EUlksIHJlZ2lvbiA9ICJpZCIpCkY2Nl9tY3AuTU9OVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuTU9OLCByZWdpb24gPSAiaWQiKQpGNjZfbWNwLlBNVCA8LSBmb3J0aWZ5KEY2Nl9tY3AuUE0sIHJlZ2lvbiA9ICJpZCIpCgptY3Auc2hpZnQuVEVTVDUgPC0gZ2dwbG90KCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLkVNVCwgYWVzKHg9RjExNF9tY3AuRU1UJGxvbmcsIHk9RjExNF9tY3AuRU1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC5EUllULCBhZXMoeD1GMTE0X21jcC5EUllUJGxvbmcsIHk9RjExNF9tY3AuRFJZVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTE0X21jcC5NT05ULCBhZXMoeD1GMTE0X21jcC5NT05UJGxvbmcsIHk9RjExNF9tY3AuTU9OVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMTRfbWNwLlBNVCwgYWVzKHg9RjExNF9tY3AuUE1UJGxvbmcsIHk9RjExNF9tY3AuUE1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuRU1ULCBhZXMoeD1GMTM3X21jcC5FTVQkbG9uZywgeT1GMTM3X21jcC5FTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLkRSWVQsIGFlcyh4PUYxMzdfbWNwLkRSWVQkbG9uZywgeT1GMTM3X21jcC5EUllUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9InJlZCIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUYxMzdfbWNwLk1PTlQsIGFlcyh4PUYxMzdfbWNwLk1PTlQkbG9uZywgeT1GMTM3X21jcC5NT05UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjEzN19tY3AuUE1ULCBhZXMoeD1GMTM3X21jcC5QTVQkbG9uZywgeT1GMTM3X21jcC5QTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC5FTVQsIGFlcyh4PUYxNDdfbWNwLkVNVCRsb25nLCB5PUYxNDdfbWNwLkVNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibHVlIixsaW5ldHlwZT0yKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuRFJZVCwgYWVzKHg9RjE0N19tY3AuRFJZVCRsb25nLCB5PUYxNDdfbWNwLkRSWVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0icmVkIixsaW5ldHlwZT0zKSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjE0N19tY3AuTU9OVCwgYWVzKHg9RjE0N19tY3AuTU9OVCRsb25nLCB5PUYxNDdfbWNwLk1PTlQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iZ3JlZW4iLGxpbmV0eXBlPTQpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMTQ3X21jcC5QTVQsIGFlcyh4PUYxNDdfbWNwLlBNVCRsb25nLCB5PUYxNDdfbWNwLlBNVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9RjI1Ml9tY3AuRU1ULCBhZXMoeD1GMjUyX21jcC5FTVQkbG9uZywgeT1GMjUyX21jcC5FTVQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MikgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9RjI1Ml9tY3AuRFJZVCwgYWVzKHg9RjI1Ml9tY3AuRFJZVCRsb25nLCB5PUYyNTJfbWNwLkRSWVQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9MykgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9RjI1Ml9tY3AuTU9OVCwgYWVzKHg9RjI1Ml9tY3AuTU9OVCRsb25nLCB5PUYyNTJfbWNwLk1PTlQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NCkgKwogICMgZ2VvbV9wb2x5Z29uKGRhdGE9RjI1Ml9tY3AuUE1ULCBhZXMoeD1GMjUyX21jcC5QTVQkbG9uZywgeT1GMjUyX21jcC5QTVQkbGF0KSwKICAjICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJibGFjayIsbGluZXR5cGU9NSkgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuRU1ULCBhZXMoeD1GMzZfbWNwLkVNVCRsb25nLCB5PUYzNl9tY3AuRU1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsdWUiLGxpbmV0eXBlPTIpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLkRSWVQsIGFlcyh4PUYzNl9tY3AuRFJZVCRsb25nLCB5PUYzNl9tY3AuRFJZVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJyZWQiLGxpbmV0eXBlPTMpICsKICBnZW9tX3BvbHlnb24oZGF0YT1GMzZfbWNwLk1PTlQsIGFlcyh4PUYzNl9tY3AuTU9OVCRsb25nLCB5PUYzNl9tY3AuTU9OVCRsYXQpLAogICAgICAgICAgICAgICBhbHBoYT0wLjEsY29sb3VyPSJncmVlbiIsbGluZXR5cGU9NCkgKwogIGdlb21fcG9seWdvbihkYXRhPUYzNl9tY3AuUE1ULCBhZXMoeD1GMzZfbWNwLlBNVCRsb25nLCB5PUYzNl9tY3AuUE1UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImJsYWNrIixsaW5ldHlwZT01KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC5FTVQsIGFlcyh4PUY2Nl9tY3AuRU1UJGxvbmcsIHk9RjY2X21jcC5FTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmx1ZSIsbGluZXR5cGU9MikgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuRFJZVCwgYWVzKHg9RjY2X21jcC5EUllUJGxvbmcsIHk9RjY2X21jcC5EUllUJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9InJlZCIsbGluZXR5cGU9MykgKwogIGdlb21fcG9seWdvbihkYXRhPUY2Nl9tY3AuTU9OVCwgYWVzKHg9RjY2X21jcC5NT05UJGxvbmcsIHk9RjY2X21jcC5NT05UJGxhdCksCiAgICAgICAgICAgICAgIGFscGhhPTAuMSxjb2xvdXI9ImdyZWVuIixsaW5ldHlwZT00KSArCiAgZ2VvbV9wb2x5Z29uKGRhdGE9RjY2X21jcC5QTVQsIGFlcyh4PUY2Nl9tY3AuUE1UJGxvbmcsIHk9RjY2X21jcC5QTVQkbGF0KSwKICAgICAgICAgICAgICAgYWxwaGE9MC4xLGNvbG91cj0iYmxhY2siLGxpbmV0eXBlPTUpICsKICB0aGVtZV9idygpICsKICBsYWJzKHg9IkVhc3RpbmcgKG0pIiwgeT0iTm9ydGhpbmcgKG0pIikgKwogIGxhYnMoY2FwdGlvbiA9ICJGaWd1cmUgIHwgIFNlYXNvbmFsIGhvbWUgcmFuZ2Ugc2hpZnRzIG9mIGZpdmUgbGl6YXJkcy4gRW1lcmdlbmNlIGFuZCBwb3N0LW1vbnNvb24gcmFuZ2VzIHN0YXkgcmVhbGF0aXZlbHkgd2l0aGluIFxuIGVhY2ggb3RoZXIuIEFsbCBzZWFzb25hbCBwb2x5Z29ucyBzdGF5IHJlbGF0aXZlbHkgc3RhYmxlIHdpdGhvdXQgYW55IG1ham9yIHNoaWZ0cyBhd2F5IGZyb20gb3RoZXIgc2Vhc29uYWwgcmFuZ2VzLiIpKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbj0ibm9uZSIsIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQoZmFjZSA9ICJib2xkIiwgaGp1c3QgPSAwLjUpKQoKbWNwLnNoaWZ0LlRFU1Q1CmBgYAoKCgoKCgoKU2Vhc29uYWwgaG9tZSByYW5nZXMgYXQgU3RvbmUgQ2FueW9uIHZhcmllZCBpbiBzaXplIGJldHdlZW4gc2Vhc29ucyBidXQgZGlkIG5vdCBzZWVtIHNoaWZ0IChGaWcuX19fKSwgd2l0aCBzZWFzb25hbCBob21lIHJhbmdlcyBvdmVybGFwcGluZyBlYWNoIG90aGVyLCBvbmx5IGV4cGFuZGluZyBvciBjb2xsYXBzaW5nIGJldHdlZW4gc2Vhc29ucy4gSG9tZSByYW5nZSBwYXR0ZXJucyBhdCBTdG9uZSBDYW55b24gZGlkIG5vdCBkaXNwbGF5IHRoZSBzYW1lIHNlYXNvbmFsIHZhcmlhdGlvbiBpbiBob21lIHJhbmdlIHNpemVzIHRoYXQgd2FzIG9ic2VydmVkIGF0IE93bCBIZWFkIEJ1dHRlcy4gQXQgU3RvbmUgQ2FueW9uLCBHaWxhIE1vbnN0ZXJzIGhhZCByZWxhdGl2ZWx5IHNtYWxsZXIgaG9tZSByYW5nZXMgdGhyb3VnaG91dCB0aGUgeWVhciwgd2hlcmUgdGhlIGhpZ2hlc3QgaW5mbGF0aW9uIG9mIHJhbmdlIHNpemUgd2FzIG9ic2VydmVkIGR1cmluZyB0aGUgZHJ5IHNlYXNvbiBmcm9tIGFuIGluY3JlYXNlIGluIG1hbGUgaG9tZSByYW5nZXMsIDE4LjIgwrEgNS40IFMuRS4gaGEgdG8gdGhhdCBvZiBmZW1hbGUgaG9tZSByYW5nZSBzaXplcyBhdCAxMC4xIMKxIDIuNCBTLkUuIGhhLiBGZW1hbGVzIGF0IFN0b25lIENhbnlvbiBkaXNwbGF5ZWQgc2ltaWxhciBob21lIHJhbmdlcyBkdXJpbmcgdGhlIG1vbnNvb24gc2Vhc29uLCAxMC42IMKxIDIuNSBTLkUuIGhhLiBIb21lIHJhbmdlIHNpemVzIGF0IE93bCBIZWFkIEJ1dHRlcyBoYWQgYSBtdWNoIGxhcmdlciBhbW91bnQgb2YgdmFyaWF0aW9uIGFjcm9zcyBzZWFzb25zIHRoYW4gZGlkIHRob3NlIGF0IFN0b25lIENhbnlvbi4gVGhlcmUgd2VyZSBzdGlsbCBzbGlnaHRseSBsYXJnZXIgcmFuZ2VzIG9ic2VydmVkIGR1cmluZyB0aGUgZHJ5IHNlYXNvbiwgcHJpbWFyaWx5IGR1ZSB0byBpbmNyZWFzZWQgaG9tZSByYW5nZSBzaXplcyBleGhpYml0ZWQgYnkgbWFsZXMgMjkuNCDCsSA0LjcgUy5FLiBoYSB2ZXJzdXMgZmVtYWxlcyBhdCAxNS42IMKxIDMuOCBTLkUuIGhhLiBEdXJpbmcgdGhlIG1vbnNvb24gc2Vhc29uLCB0aGVyZSB3YXMgc3RpbGwgeWV0IGEgbGFyZ2UgaW5mbHV4IG9mIGhvbWUgcmFuZ2VzIHNpemVzIHdoZXJlIGZlbWFsZSBob21lIHJhbmdlcyBpbmNyZWFzZWQgdG8gMjIuOSDCsSA0LjAgUy5FLiBoYS4gIEZvciBib3RoIHBvcHVsYXRpb25zLCBob21lIHJhbmdlcyBkdXJpbmcgdGhlIGVtZXJnZW5jZSBhbmQgcG9zdC1tb25zb29uIHNlYXNvbnMgd2VyZSBzbWFsbCwgbWFya2luZyB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgb2Ygb3ZlcndpbnRlcmluZyBwZXJpb2RzLCB3aGVyZSBtaW5pbWFsIG1vdmVtZW50IGlzIG9ic2VydmVkIGluIGJvdGggZ3JvdXBzLiAKICAKQW5hbHlzaXMgaW5kaWNhdGVkIHRoYXQgdGhlcmUgd2FzIGFuIGVmZmVjdCBvZiBzZWFzb24gKGRmID0gMywgRiA9IDE1LjQxLCBQID0gPDAuMDAxKSBhcyB3ZWxsIGFzIGFuIGludGVyYWN0aW9uIG9mIGVudmlyb25tZW50IGFuZCBzZWFzb24gKGRmID0gMywgRiA9IDYuODQsIFAgPSA8MC4wMDEpLCBpbmRpY2F0aW5nIHRoYXQgY2hhbmdlcyBpbiBzZWFzb25hbCBob21lIHJhbmdlcyBzaXplcyB2YXJpZWQgYmV0d2VlbiBlYWNoIGVudmlyb25tZW50LiBQb3N0LUhvYyBhbmFseXNlcyBvbiB0aGUgU3RvbmUgQ2FueW9uIGRhdGEgc2V0IHdpdGggaG9tZSByYW5nZSBtZWFucyBhdmVyYWdlZCBhY3Jvc3Mgc2V4LCBzdWdnZXN0ZWQgdGhhdCB0aGVyZSB3YXMgbm8gc2lnbmlmaWNhbnQgZGlmZmVyZW5jZSBpbiBob21lIHJhbmdlcyBiZXR3ZWVuIHRoZSBlbWVyZ2VuY2UgKDQuMzIgwrEgMi41NSBTLkUuIGhhKSBhbmQgcG9zdC1tb25zb29uIHNlYXNvbnMgKDUuMDkgwrEgMi4wNyBTLkUuIGhhKSBub3IgZHJ5IGFuZCBtb25zb29uICgxMi4yMyDCsSAxLjc0IFMuRS4gaGEgYW5kIDkuMDQgwrEgMS43OCBTLkUuIGhhKS4gVGhlcmUgd2FzIGFsc28gbm8gc2lnbmlmaWNhbmNlIGJldHdlZW4gZW1lcmdlbmNlIGFuZCBkcnkvbW9uc29vbiBzZWFzb25zLCBidXQgdGhlcmUgd2FzIGEgZGlmZmVyZW5jZSBiZXR3ZWVuIGRyeSBhbmQgcG9zdC1tb25zb29uIChkZiA9IDgwLjIsIFAgPSAwLjA0KS4gUG9zdC1Ib2MgYW5hbHlzZXMgb24gdGhlIE93bCBIZWFkIEJ1dHRlcyBwb3B1bGF0aW9uIGluZGljYXRlZCB0aGF0IHRoZXJlIHdhcyBubyBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gZW1lcmdlbmNlICgzLjMzIMKxIDIuMjQgUy5FLiBoYSkgYW5kIHBvc3QtbW9uc29vbiAoMi4zNiDCsSAyLjM2IFMuRS4pIG5vciBkcnkgYW5kIG1vbnNvb24gKDE4Ljg2IMKxIDIuMjUgUy5FLiBoYSBhbmQgMjEuODUgwrEgMi4wMyBTLkUuIGhhKSByZWZsZWN0aW5nIHRoZSBzYW1lIHBhdHRlcm4gYXQgU3RvbmUgQ2FueW9uLiBIb3dldmVyLCB0aGVyZSB3YXMgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlIGJldHdlZW4gZW1lcmdlbmNlIGFuZCBkcnkvbW9uc29vbiAoZGYgPSA2OS40LCBQID0gPDAuMDAwMSwgYW5kIGRmID0gNjgsIFAgPSA8MC4wMDAxIHJlc3BlY3RpdmVseSksIGFzIHdlbGwgYXMgcG9zdC1tb25zb29uIGFuZCBkcnkvbW9uc29vbiAoZGYgPSA3OC45LCBQID0gPDAuMDAwMSwgYW5kIGRmID0gNzQsIFAgPSA8MC4wMDAxKS4gVGhpcyBzaG93cyBhIHJhdGhlciBkaWZmZXJlbnQgcGF0dGVybiB0aGFuIHNlZW4gYXQgU3RvbmUgQ2FueW9uLiBQYWlyd2lzZSBhbmFseXNlcyBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGlvbnMgaW5kaWNhdGVkIG5vIGRpZmZlcmVuY2UgYmV0d2VlbiBlbWVyZ2VuY2UgKGRmID0gODcuNywgUCA9IDAuNzYpIG9yIHBvc3QtbW9uc29vbiAoZGYgPSA4OS40LCBQID0gMC4zNSkuIERpZmZlcmVuY2VzIGluIGhvbWUgcmFuZ2Ugc2l6ZXMgYmV0d2VlbiB0aGUgdHdvIHBvcHVsYXRpb25zIHdlcmUgYmV0d2VlbiB0aGUgZHJ5IGFuZCBtb25zb29uIHNlYXNvbnMgKEZpZy5fX18pLiAgT3dsIEhlYWQgaG9tZSByYW5nZXMgd2VyZSA1OCUgbGFyZ2VyIHRoYW4gdGhvc2UgYXQgU3RvbmUgQ2FueW9uIGR1cmluZyB0aGUgZHJ5IHNlYXNvbiwgYW5kIDc2JSBsYXJnZXIgZHVyaW5nIHRoZSBtb25zb29uIHNlYXNvbi4gCiAgCgoKCgpUYWJsZSA1IHwgR3JvdXAgbWVhbnMgb2Ygc2Vhc29uYWwgaG9tZSByYW5nZXMgYmV0d2VlbiBTdG9uZSBDYW55b24gKHN1YnNpZGl6ZWQpIGFuZCBPd2wgSGVhZCBCdXR0ZXMgKG5vbi1zdWJzaWRpemVkKS4gVGhlc2UgbWVhbnMgYXJlIGF2ZXJhZ2VkIGFjcm9zcyBzZXguIApgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0Kc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpsaWJyYXJ5KFJtaXNjKQoKU0VBU19HUlBfTWVhbnMgPC0gc3VtbWFyeVNFKHNlYXNvbmFsLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiRW52aXJvbm1lbnQiLCJTZWFzb24iKSwgbmEucm0gPSBUUlVFKQoKIyBTRUFTX0dSUF9NZWFucwprYWJsZShTRUFTX0dSUF9NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnUmF3IEdyb3VwIE1lYW5zIG9mIFNlYXNvbmFsIEhvbWUgUmFuZ2VzJykKYGBgCgoKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpsaWJyYXJ5KGxtZTQpCmxpYnJhcnkocmVhZHIpCmxpYnJhcnkobG1lclRlc3QpCiMgc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpSTS5tb2QuU2Vhc29uIDwtIGxtZXIoSG9tZV9SYW5nZV8xMDBtY3B+RW52aXJvbm1lbnQrU2Vhc29uK1NleCtOK0Vudmlyb25tZW50KlNlYXNvbisoMXxHaWxhKSwgCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPXNlYXNvbmFsKQpzdW1tYXJ5KFJNLm1vZC5TZWFzb24pCgojIGFub3ZhKFJNLm1vZC5TZWFzb24pCgojICMgbWFyZ2luYWwuc2Vhc29uIDwtIGxzbWVhbnMoUk0ubW9kLlNlYXNvbiwgCiMgIyAgICAgICAgICAgICAgICAgICAgfiBFbnZpcm9ubWVudCkKIyAjIG1hcmdpbmFsLnNlYXNvbgpgYGAKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQphbm92YShSTS5tb2QuU2Vhc29uKQpgYGAKCgoKCgoKClRhYmxlIDYgfCBTZWFzb25hbCBob21lIHJhbmdlIG1lYW5zIGJldHdlZW4gU3RvbmUgQ2FueW9uIChzdWJzaWRpemVkKSBhbmQgT3dsIEhlYWQgQnV0dGVzIChub24tc3Vic2lkaXplZCkgcG9wdWF0aW9ucyBmb3IgbWFsZXMgYW5kIGZlbWFsZXMuIFRoZXNlIGFyZSByYXcgbWVhbnMgYmVmb3JlIGJlaW5nIGFkanVzdGVkIGZvciBlbnZpcm9ubWVudCwgc2Vhc29uLCBzZXgsIGFuZCBzYW1wbGUgc2l6ZS4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClNFQVNfR1JQX1RFU1QgPC0gc3VtbWFyeVNFKHNlYXNvbmFsLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzEwMG1jcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJFbnZpcm9ubWVudCIsIlNlYXNvbiIsIlNleCIpLCBuYS5ybSA9IFRSVUUpCgojIFNFQVNfR1JQX01lYW5zCmthYmxlKFNFQVNfR1JQX1RFU1QsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1NlYXNvbmFsIE1lYW5zIGJ5IFNleCBCZXR3ZWVuIFBvcHVsYXRpb25zJykKYGBgCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQoKcGQgPC0gcG9zaXRpb25fZG9kZ2UoMC4zKSAjIG1vdmUgdGhlbSAuMDUgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0ICgnZG9kZ2VzJykKCiMjIFRFU1QgMwpyYXcuc2Vhc29uYWw8LWdncGxvdChTRUFTX0dSUF9URVNULGFlcyh4PUVudmlyb25tZW50LCB5PUhvbWVfUmFuZ2VfMTAwbWNwLCBzaGFwZT1TZXgpKSArIAogIGdlb21fcG9pbnQoYWVzKHNoYXBlPVNleCksIHNpemUgPSAyLCBwb3NpdGlvbj1wZCkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49SG9tZV9SYW5nZV8xMDBtY3Atc2UsIHltYXg9SG9tZV9SYW5nZV8xMDBtY3Arc2UpLCBwb3NpdGlvbiA9IHBkLAogICAgICAgICAgICAgICAgd2lkdGg9MC4zLCBzaXplPTAuNSwgbHR5PTEpICsgCiAgIyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoJ2JsYWNrJywncmVkJykpICsKICBmYWNldF9ncmlkKH5TZWFzb24pICsKICAjIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDgsMTkpKSsKICBsYWJzKGNhcHRpb24gPSAiRmlndXJlICB8ICBSYXcgc2Vhc29uYWwgbWVhbnMgb2Ygc2V4ZXMgYmV0d2VlbiBlYWNoIGVudmlyb25tZW50LiBIb21lIHJhbmdlcyBvZiB0aGUgc3Vic2lkZXplZCBwb3B1bGF0aW9uIHJlbWFpbiBcbiByZWxhdGl2ZWx5IHNtYWxsIHRocm91Z2hvdXQgdGhlIHNlYXNvbnMsIHdpdGggdGhlIGV4Y2VwdGlvbiBkdXJpbmcgdGhlIGRyeSBzZWFzb24gd2hlcmUgd2Ugb2JzZXJ2ZSBpbmNyZWFzZWQgbWFsZSBcbiBob21lIHJhbmdlcy4gVGhlIG5vbi1zdWJzaWRpemVkIHBvcHVsYXRpb24gZXhoaWJpdHMgYSBsYXJnZSBhbW91bnQgb2YgdmFyaWF0aW9uIGFjcm9zcyBzZWFzb25zLiIpKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpKwogICMgc2NhbGVfeF9kaXNjcmV0ZShsaW1pdHM9YygnRW1lcmdlbmNlJywnRHJ5JywnTW9uc29vbicsJ1Bvc3RfTW9uc29vbicpKSArCiAgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gYyguODcsLjg1KSwgbGVnZW5kLmJhY2tncm91bmQgPSBlbGVtZW50X3JlY3QoY29sb3VyID0gImJsYWNrIiksCiAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTEuNSwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuNSksIGhqdXN0ID0gMC41KSwKICAgICAgICBheGlzLnRleHQueCAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTgpLAogICAgICAgIGF4aXMudGV4dC55ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9OCksCiAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwKICAgICAgICBheGlzLnRpdGxlLnggID0gZWxlbWVudF90ZXh0KHNpemU9MTApLAogICAgICAgIGxlZ2VuZC50ZXh0ID0gZWxlbWVudF90ZXh0KHNpemUgPSAxMiwgZmFjZSA9ICJib2xkIiksCiAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKwogIHhsYWIoIkVudmlyb25tZW50IikgKyB5bGFiKCJBcmVhIChoYSkgdXNpbmcgMTAwJSBNQ1AiKQpyYXcuc2Vhc29uYWwKYGBgCgoKCgoKQWRqdXN0ZWQgU2Vhc29uYWwgTWVhbnMKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwojIyBSYXcgc2Vhc29uYWwgbWVhbnMKIyBwZCA8LSBwb3NpdGlvbl9kb2RnZSgwLjMpICMgbW92ZSB0aGVtIC4wNSB0byB0aGUgbGVmdCBhbmQgcmlnaHQgKCdkb2RnZXMnKQojIAojIyBURVNUIDMKIyByYXcuc2Vhc29uYWw8LWdncGxvdChTRUFTX0dSUF9URVNULGFlcyh4PUVudmlyb25tZW50LCB5PUhvbWVfUmFuZ2VfMTAwbWNwLCBzaGFwZT1TZXgpKSArCiMgICBnZW9tX3BvaW50KGFlcyhzaGFwZT1TZXgpLCBzaXplID0gMiwgcG9zaXRpb249cGQpICsKIyAgIGdlb21fZXJyb3JiYXIoYWVzKHltaW49SG9tZV9SYW5nZV8xMDBtY3Atc2UsIHltYXg9SG9tZV9SYW5nZV8xMDBtY3Arc2UpLCBwb3NpdGlvbiA9IHBkLAojICAgICAgICAgICAgICAgICB3aWR0aD0wLjMsIHNpemU9MC41LCBsdHk9MSkgKwojICAgIyBzY2FsZV9jb2xvdXJfbWFudWFsKHZhbHVlcyA9IGMoJ2JsYWNrJywncmVkJykpICsKIyAgIGZhY2V0X2dyaWQoflNlYXNvbikgKwojICAgIyAjIHNjYWxlX3NoYXBlX21hbnVhbCh2YWx1ZXMgPSBjKDgsMTkpKSsKIyAgICMgbGFicyhjYXB0aW9uID0gIkZpZ3VyZSAgfCAgUmF3IHNlYXNvbmFsIG1lYW5zIG9mIHNleGVzIGJldHdlZW4gZWFjaCBlbnZpcm9ubWVudC4gSG9tZSByYW5nZXMgb2YgdGhlIHN1YnNpZGV6ZWQgcG9wdWxhdGlvbiByZW1haW4gXG4gcmVsYXRpdmVseSBzbWFsbCB0aHJvdWdob3V0IHRoZSBzZWFzb25zLCB3aXRoIHRoZSBleGNlcHRpb24gZHVyaW5nIHRoZSBkcnkgc2Vhc29uIHdoZXJlIHdlIG9ic2VydmUgaW5jcmVhc2VkIG1hbGUgXG4gaG9tZSByYW5nZXMuIFRoZSBub24tc3Vic2lkaXplZCBwb3B1bGF0aW9uIGV4aGliaXRzIGEgbGFyZ2UgYW1vdW50IG9mIHZhcmlhdGlvbiBhY3Jvc3Mgc2Vhc29ucy4iKSsKIyAgIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpKwojICAgIyBzY2FsZV94X2Rpc2NyZXRlKGxpbWl0cz1jKCdFbWVyZ2VuY2UnLCdEcnknLCdNb25zb29uJywnUG9zdF9Nb25zb29uJykpICsKIyAgIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg3LC44NSksIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpLAojICAgICAgICAgcGxvdC50aXRsZSA9IGVsZW1lbnRfdGV4dChsaW5laGVpZ2h0PTEuNSwgZmFjZT0iYm9sZCIsIHNpemU9cmVsKDEuNSksIGhqdXN0ID0gMC41KSwKIyAgICAgICAgIGF4aXMudGV4dC54ICA9IGVsZW1lbnRfdGV4dCh2anVzdD0wLjUsIHNpemU9OCksCiMgICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTgpLAojICAgICAgICAgYXhpcy50aXRsZS55ICA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwKIyAgICAgICAgIGF4aXMudGl0bGUueCAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksCiMgICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAojICAgICAgICAgc3RyaXAudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEyKSkgKwojICAgeGxhYigiIikgKyB5bGFiKCIiKQoKIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiMjIEFqdXN0ZWQgc2Vhc29uYWwgbWVhbnMKUk0ubW9kLlNlYXNvbiA8LSBsbWVyKEhvbWVfUmFuZ2VfMTAwbWNwfkVudmlyb25tZW50K1NlYXNvbitTZXgrTitFbnZpcm9ubWVudCpTZWFzb24rKDF8R2lsYSksCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPXNlYXNvbmFsKQoKIyBSTS5tYXJnaW5hbCA8LSBsc21lYW5zKFJNLm1vZC5TZWFzb24sIAojICAgICAgICAgICAgICAgICAgICAgfiBFbnZpcm9ubWVudCkKIyBSTS5tYXJnaW5hbAoKIyMgQ0FUQUdPUklaRSBMU00gR1JBUEggQlkgU0VYIEJFVFdFRU4gRU5WSVJPTk1FTlQ6CnJlZlJNX3NlYXNvbiA8LSBsc21lYW5zKFJNLm1vZC5TZWFzb24sIHNwZWNzID0gYygiRW52aXJvbm1lbnQiLCJTZWFzb24iLCJTZXgiKSkKCiMgcmVmUk1fc2V4CnJlZl9kZlJNX3NlYXNvbiA8LSBhcy5kYXRhLmZyYW1lKHN1bW1hcnkocmVmUk1fc2Vhc29uKSkKcGRfUk0gPC0gcG9zaXRpb25fZG9kZ2UoMC4yKQoKYWRqLnNlYXNvbmFsPC1nZ3Bsb3QocmVmX2RmUk1fc2Vhc29uLGFlcyh4PUVudmlyb25tZW50LCB5PWxzbWVhbiwgc2hhcGU9U2V4KSkgKyAKICBnZW9tX3BvaW50KGFlcyhzaGFwZT1TZXgpLCBzaXplID0gMiwgcG9zaXRpb249cGQsIHNob3cubGVnZW5kPUZBTFNFKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sc21lYW4tU0UsIHltYXg9bHNtZWFuK1NFKSwgcG9zaXRpb24gPSBwZCwKICAgICAgICAgICAgICAgIHdpZHRoPTAuMywgc2l6ZT0wLjUsIGx0eT0xKSArIAogIGZhY2V0X2dyaWQoflNlYXNvbikgKwpsYWJzKGNhcHRpb24gPSAiRmlndXJlICB8IEFkanVzdGVkIHNlYXNvbmFsIGhvbWUgcmFuZ2UgbWVhbnMgb2Ygc2V4ZXMgYmV0d2VlbiBlbnZpcm9ubWVudHMuIEhvbWUgcmFuZ2VzIG9mIHRoZSBzdWJzaWRlemVkIFxuIHBvcHVsYXRpb24gcmVtYWluIHJlbGF0aXZlbHkgc21hbGwgdGhyb3VnaG91dCB0aGUgc2Vhc29ucy4gQWZ0ZXIgYWRqdXN0bWVudCBtYWxlIGhvbWUgcmVhbmdlcyB3ZXJlIHJlZHVjZWQsIFxuIGJ1dCBzdGlsbCByZW1haW5lZCBzbGlnaHRseSBsYXJnZXIgdGhlbiBmZW1hbGVzLiIpKwogIHRoZW1lKHBsb3QuY2FwdGlvbiA9IGVsZW1lbnRfdGV4dChoanVzdCA9IDAsbGluZWhlaWdodCA9IDAuOSkpKwogICMgc2NhbGVfc2hhcGVfbWFudWFsKHZhbHVlcyA9IGMoOCwxOSkpKwogIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9IGMoLjg3LC44NSksIGxlZ2VuZC5iYWNrZ3JvdW5kID0gZWxlbWVudF9yZWN0KGNvbG91ciA9ICJibGFjayIpLAogICAgICAgIHBsb3QudGl0bGUgPSBlbGVtZW50X3RleHQobGluZWhlaWdodD0xLjUsIGZhY2U9ImJvbGQiLCBzaXplPXJlbCgxLjUpLCBoanVzdCA9IDAuNSksCiAgICAgICAgYXhpcy50ZXh0LnggID0gZWxlbWVudF90ZXh0KHZqdXN0PTAuNSwgc2l6ZT04KSwKICAgICAgICBheGlzLnRleHQueSAgPSBlbGVtZW50X3RleHQodmp1c3Q9MC41LCBzaXplPTgpLAogICAgICAgIGF4aXMudGl0bGUueSAgPSBlbGVtZW50X3RleHQoc2l6ZT0xMCksCiAgICAgICAgYXhpcy50aXRsZS54ICA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSwKICAgICAgICBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplID0gMTIsIGZhY2UgPSAiYm9sZCIpLAogICAgICAgIHN0cmlwLnRleHQgPSBlbGVtZW50X3RleHQoc2l6ZT0xMikpICsKICB4bGFiKCJFbnZpcm9ubWVudCIpICsgeWxhYigiQXJlYSAoaGEpIHVzaW5nIDEwMCUgTUNQIikKYWRqLnNlYXNvbmFsCgojIENvbWJpbmUgcmF3IGFuZCBhZGp1c3RlZCBzZWFzb25hbCBob21lIHJhbmdlcyB3aXRoIGEgc2luZ2xlIGNhcHRpb246CiMgZ3JpZC5hcnJhbmdlKHJhdy5zZWFzb25hbCwgYWRqLnNlYXNvbmFsLCBucm93ID0gMixoZWlnaHRzPXVuaXQoYygyLDIpLCBjKCJpbiIsICJpbiIpKSwKIyAgICAgICAgICAgICAgYm90dG9tID0gdGV4dEdyb2IoIiIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdwID0gZ3Bhcihmb250ZmFjZSA9IDEsZm9udHNpemUgPSAxMCksaGp1c3QgPSAwLCB4ID0gMCkpCgojIGxpYnJhcnkoZ3RhYmxlKQojIGcyIDwtIGdncGxvdEdyb2IocmF3LnNlYXNvbmFsKQojIGczIDwtIGdncGxvdEdyb2IoYWRqLnNlYXNvbmFsKQojIGcgPC0gcmJpbmQoZzIsIGczLCBzaXplID0gImZpcnN0IikKIyBnJHdpZHRocyA8LSB1bml0LnBtYXgoZzIkd2lkdGhzLCBnMyR3aWR0aHMpCiMgZ3JpZC5uZXdwYWdlKCkKIyBncmlkLmRyYXcoZykKCmBgYAoKCgoKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKUG9zdC1Ib2MgY29tcGFyaXNvbnMgYmV0d2VlbiBwb3B1bGF0aW9ucyBmb3Igc2Vhc29uYWwgaG9tZSByYW5nZSBhbmFseXNpczoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQplbW1fcy50IDwtIGVtbWVhbnMoUk0ubW9kLlNlYXNvbiwgcGFpcndpc2UgfiBFbnZpcm9ubWVudCB8IFNlYXNvbikKZW1tX3MudApgYGAKCgpHcmFwaGljYWwgQ29tcGFyaXNvbnMgb2Ygc2Vhc29ucyBiZXR3ZWVuIHRoZSB0d28gcG9wdWxhdGluczoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMgcGxvdChTZXguZW1tLnNlYXMsIGNvbXBhcmlzb25zID0gVFJVRSkKcGxvdChlbW1fcy50LCBjb21wYXJpc29ucyA9IFRSVUUpCmBgYCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApGaWd1cmUgMTEgfCBQYWlyd2lzZSBjb21wYXJpc29ucyBvZiBlYWNoIHNlYXNvbiBiZXR3ZWVuIGVudmlyb25tZW50cy4gT3ZlcmxhcHBpbmcgcmVkIGJhcnMgaW5kaWNhdGUgbm8gc3RhdGlzdGljYWwgZGlmZmVyZW5jZS4gCgoKCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KIyBTZWFzLk1lYW5zVDwtZW1tZWFucyhSTS5tb2QuU2Vhc29uLCBsaXN0KHBhaXJ3aXNlIH4gRW52aXJvbm1lbnQsIHBhaXJ3aXNlIH4gU2Vhc29uKSkKIyBTZWFzLk1lYW5zVAoKZW1tX3MudDQgPC0gZW1tZWFucyhSTS5tb2QuU2Vhc29uLCBwYWlyd2lzZSB+IFNlYXNvbiB8IEVudmlyb25tZW50KQplbW1fcy50NApgYGAKCgpHcmFwaGljYWwgQ29tcGFyaXNvbnMgYmV0d2VlbiBzZWFzb25zIHdpdGhpbiB0aGUgdHdvIHBvcHVsYXRpb25zOgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KcGxvdChlbW1fcy50NCwgY29tcGFyaXNvbnMgPSBUUlVFKQpgYGAKRmlndXJlIDEyIHwgUGFpcndpc2UgY29tcGFyaXNvbnMgYmV0d2VlbiBzZWFzb25zIHdpdGhpbiBlYWNoIGVudmlyb25tZW50IGFnYWluc3QgZXN0aW1hdGVkIG1hcmdpbmFsIG1lYW5zLiBPdmVybGFwcGluZyByZWQgYmFycyBpbmRpY2F0ZSBubyBzdGF0aXN0aWNhbCBkaWZmZXJlbmNlLiAKCgoKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CnN1YiA8LSBzdWJzZXQoc2Vhc29uYWwsIEVudmlyb25tZW50ID09ICJzdWJzaWRpemVkIikKClJNLm1vZC5TdWIgPC0gbG1lcihIb21lX1JhbmdlXzEwMG1jcH5TZWFzb24rU2V4K04rU2Vhc29uKlNleCsoMXxHaWxhKSwgZGF0YT1zdWIpCgplbW1fcy50NSA8LSBlbW1lYW5zKFJNLm1vZC5TdWIsIHBhaXJ3aXNlIH4gU2V4IHwgU2Vhc29uKQplbW1fcy50NSAKYGBgCgpHcmFwaGljYWwgQ29tcGFyaXNvbnMgYmV0d2VlbiBzZXggd2l0aGluIHRoZSBzdWJzaWRpemVkIHBvcHVsYXRpb246CmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpwbG90KGVtbV9zLnQ1LCBjb21wYXJpc29ucyA9IFRSVUUpCmBgYCAgIAogICAKICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIApUYWJsZSA3IHwgTWVhbiBpbmRpdmlkdWFsIHNlYXNvbmFsIGhvbWUgcmFuZ2VzIHBvb2xlZCBmcm9tIHRoZSBlbnRpcmUgc3R1ZHkgcGVyaW9kLiBNaXNzaW5nIHZhbHVlcyBhcmUgZGVwaWN0ZWQgd2hlcmUgbm8gbG9jYXRpb25zIGZvciB0aGF0IGFuaW1hbCBkdXJpbmcgdGhhdCBwZXJpb2Qgd2VyZSBzdWNjZXNzZnVsbC4KYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClNlYXMuSW5kLk1lYW5zPC1yZWFkLmNzdigiU2Vhc29uYWwgSFIgVGFibGUuY3N2IikKa2FibGUoU2Vhcy5JbmQuTWVhbnMsIGZvcm1hdCA9ICJwYW5kb2MiLCBjYXB0aW9uID0gJ1NlYXNvbmFsIEluZGl2aWR1YWwgSG9tZSBSYW5nZXMgKE1DUCkuJykKYGBgCgoKCgoKCgojIyBTZWFzb25hbCBIb21lIFJhbmdlIChLREUpCgoKVGFibGUgIHwgUmF3IEtERSBncm91cCBtZWFucyBvZiBzZWFzb25hbCBob21lIHJhbmdlcyBiZXR3ZWVuIHNleGVzIGF0IFN0b25lIENhbnlvbiAoc3Vic2lkaXplZCkuCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpzZWFzb24ua2RlPC1yZWFkLmNzdigiU0NfU2Vhc29uYWxfSW5wdXQuY3N2IikKClNFQVNfS0RFX1NleCA8LSBzdW1tYXJ5U0Uoc2Vhc29uLmtkZSwgbWVhc3VyZXZhcj0iSG9tZV9SYW5nZV85NWtkZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHZhcnM9YygiU2Vhc29uIiwiU2V4IiksIG5hLnJtID0gVFJVRSkKCiMgU0VBU19HUlBfTWVhbnMKa2FibGUoU0VBU19LREVfU2V4LCBmb3JtYXQgPSAicGFuZG9jIiwgY2FwdGlvbiA9ICdSYXcgS0RFIEdyb3VwIE1lYW5zIG9mIFNlYXNvbmFsIEhvbWUgUmFuZ2VzIGJldHdlZW4gc2V4ZXMnKQpgYGAKCiAKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClNFQVNfS0RFX01lYW5zIDwtIHN1bW1hcnlTRShzZWFzb24ua2RlLCBtZWFzdXJldmFyPSJIb21lX1JhbmdlXzk1a2RlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJTZWFzb24iKSwgbmEucm0gPSBUUlVFKQoKIyBTRUFTX0dSUF9NZWFucwprYWJsZShTRUFTX0tERV9NZWFucywgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnUmF3IEtERSBHcm91cCBNZWFucyBvZiBTZWFzb25hbCBIb21lIFJhbmdlcycpCmBgYAogCiAKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CiMgc2Vhc29uYWw8LXJlYWQuY3N2KCJTQ19TZWFzb25hbF9EYXRhLmNzdiIpCgpSTS5LREUuU2Vhc29uIDwtIGxtZXIoSG9tZV9SYW5nZV85NWtkZX5TZWFzb24rU2V4K04rU2Vhc29uKlNleCsoMXxHaWxhKSwgCiAgICAgICAgICAgICAgICAgICAgICBkYXRhPXNlYXNvbi5rZGUpCnN1bW1hcnkoUk0uS0RFLlNlYXNvbikKYGBgCiAKQU5PVkEgVGFibGUuIFNlYXNvbmFsIEtERQpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KYW5vdmEoUk0uS0RFLlNlYXNvbikKYGBgCgogCgpSYXcgU2Vhc29uYWwgS0RFIE1lYW5zCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpnZ3Bsb3QoU0VBU19LREVfU2V4LGFlcyh4PVNleCwgeT1Ib21lX1JhbmdlXzk1a2RlKSkgKyAKICBnZW9tX3BvaW50KHNpemUgPSAyLCBwb3NpdGlvbj1wZCkgKwogIGdlb21fZXJyb3JiYXIoYWVzKHltaW49SG9tZV9SYW5nZV85NWtkZS1zZSwgeW1heD1Ib21lX1JhbmdlXzk1a2RlK3NlKSwgcG9zaXRpb24gPSBwZCwKICAgICAgICAgICAgICAgIHdpZHRoPTAuMywgc2l6ZT0wLjUsIGx0eT0xKSArIAogIGZhY2V0X2dyaWQoflNlYXNvbikgKwogIHRoZW1lX2J3KCkgKwogIHhsYWIoIlNleCIpICsgeWxhYigiQXJlYSAoaGEpIHVzaW5nIDk1JSBLREUiKQpgYGAKCgoKCgpBZGp1c3RlZCBTZWFzb25hbCBLREUgTWVhbnMKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9ClJNLktERS5TZWFzb24gPC0gbG1lcihIb21lX1JhbmdlXzk1a2RlflNlYXNvbitTZXgrTitTZWFzb24qU2V4KygxfEdpbGEpLCAKICAgICAgICAgICAgICAgICAgICAgIGRhdGE9c2Vhc29uLmtkZSkKCiMgUk0ubWFyZ2luYWwgPC0gbHNtZWFucyhSTS5tb2QuU2Vhc29uLCAKIyAgICAgICAgICAgICAgICAgICAgIH4gRW52aXJvbm1lbnQpCiMgUk0ubWFyZ2luYWwKCiMjIENBVEFHT1JJWkUgTFNNIEdSQVBIIEJZIFNFWCBCRVRXRUVOIEVOVklST05NRU5UOgpyZWZSTV9LREUgPC0gbHNtZWFucyhSTS5LREUuU2Vhc29uLCBzcGVjcyA9IGMoIlNlYXNvbiIsIlNleCIpKQoKIyByZWZSTV9zZXgKcmVmX2RmUk1fS0RFIDwtIGFzLmRhdGEuZnJhbWUoc3VtbWFyeShyZWZSTV9LREUpKQpwZF9STSA8LSBwb3NpdGlvbl9kb2RnZSgwLjIpCgpnZ3Bsb3QocmVmX2RmUk1fS0RFLGFlcyh4PVNleCwgeT1sc21lYW4pKSArIAogIGdlb21fcG9pbnQoc2l6ZSA9IDIsIHBvc2l0aW9uPXBkKSArCiAgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1sc21lYW4tU0UsIHltYXg9bHNtZWFuK1NFKSwgcG9zaXRpb24gPSBwZCwKICAgICAgICAgICAgICAgIHdpZHRoPTAuMywgc2l6ZT0wLjUsIGx0eT0xKSArIAogIGZhY2V0X2dyaWQoflNlYXNvbikgKwogIHhsYWIoIlNleCIpICsgeWxhYigiQXJlYSAoaGEpIHVzaW5nIDk1JSBLREUiKQpgYGAKCiAKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQplbW1fc2V4X0tERSA8LSBlbW1lYW5zKFJNLktERS5TZWFzb24sIHBhaXJ3aXNlIH4gU2V4IHwgU2Vhc29uKQplbW1fc2V4X0tERSAKYGBgCgpgYGB7ciBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFLCBwYWdlZC5wcmludD1GQUxTRX0KcGxvdChlbW1fc2V4X0tERSwgY29tcGFyaXNvbnM9VFJVRSkKYGBgCgoKCgoKCiMgSG9tZSBSYW5nZSBPdmVybGFwIChNQ1ApCgoKPHNwYW4gc3R5bGU9ImNvbG9yOmJsdWUiPkdpbGEgTW9uc3RlciBIb21lIFJhbmdlIE92ZXJsYXAgb2YgMTAwJSBNQ1BzLjwvc3Bhbj4KCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQoKbWNwX2FuYWx5c2lzLlBPTFkgPC0gZnVuY3Rpb24oZmlsZW5hbWUsIHBlcmNlbnRhZ2UpewogIGRhdGEgPC0gcmVhZC5jc3YoZmlsZSA9IGZpbGVuYW1lLHN0cmluZ3NBc0ZhY3RvcnMgPSBGQUxTRSkKICBkYXRhLnNwIDwtIGRhdGFbLCBjKCJMSVpBUkROVU1CRVIiLCAiRUFTVElORyIsICJOT1JUSElORyIpXQogIGNvb3JkaW5hdGVzKGRhdGEuc3ApIDwtIGMoIkVBU1RJTkciLCAiTk9SVEhJTkciKQogIHByb2o0c3RyaW5nKGRhdGEuc3ApIDwtIENSUy5TQwogIG1jcF9vdXQgPC0gbWNwKGRhdGEuc3AsIHBlcmNlbnRhZ2UsIHVub3V0PSJoYSIpCn0KCk02N19NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL002Ny9NNjcgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTY5X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTY5L002OSAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNMjU1X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTI1NS9NMjU1IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk0yMTVfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NMjE1L00yMTUgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKTTE0X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTE0L00xNCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpNMTE5X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vTTExOS9NMTE5IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCk0xMTJfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9NMTEyL00xMTIgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKCkY2Nl9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0Y2Ni9GNjYgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjM2X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjM2L0YzNiAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMjUyX01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjI1Mi9GMjUyIC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYyMTRfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMjE0L0YyMTQgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjIwMF9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YyMDAvRjIwMCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTQ3X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjE0Ny9GMTQ3IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxNDZfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTQ2L0YxNDYgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjEzN19NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxMzcvRjEzNyAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQpGMTM1X01DUDwtbWNwX2FuYWx5c2lzLlBPTFkoJy4vRjEzNS9GMTM1IC5jc3YnLCBwZXJjZW50YWdlPSAxMDApCkYxMTRfTUNQPC1tY3BfYW5hbHlzaXMuUE9MWSgnLi9GMTE0L0YxMTQgLmNzdicsIHBlcmNlbnRhZ2U9IDEwMCkKRjEwNF9NQ1A8LW1jcF9hbmFseXNpcy5QT0xZKCcuL0YxMDQvRjEwNCAuY3N2JywgcGVyY2VudGFnZT0gMTAwKQoKTWFsZS5NQ1AgPC0gcmJpbmQoTTY3X01DUCxNNjlfTUNQLE0yNTVfTUNQLE0yMTVfTUNQLE0xNF9NQ1AsTTExOV9NQ1AsTTExMl9NQ1ApCkZlbWFsZS5NQ1AgPC0gcmJpbmQoRjY2X01DUCxGMzZfTUNQLEYyNTJfTUNQLEYyMTRfTUNQLEYyMDBfTUNQLEYxNDdfTUNQLEYxNDZfTUNQLEYxMzdfTUNQLAogICAgICAgICAgICAgICAgICAgIEYxMzVfTUNQLEYxMTRfTUNQLEYxMDRfTUNQKQoKbWFwdmlld09wdGlvbnMoYmFzZW1hcHMgPSBjKCJPcGVuU3RyZWV0TWFwIiwiRXNyaS5Xb3JsZEltYWdlcnkiLCJPcGVuVG9wb01hcCIpLAogICAgICAgICAgICAgICBuYS5jb2xvciA9ICJtYWdlbnRhIiwKICAgICAgICAgICAgICAgbGF5ZXJzLmNvbnRyb2wucG9zID0gInRvcGxlZnQiKQoKbWFwdmlldyhNYWxlLk1DUCwgbGVnZW5kPUYsIHpjb2w9ImlkIiwgY29sLnJlZ2lvbnMgPSBjKCJibHVlIiksIGFscGhhLnJlZ2lvbnM9MC4zKSArIAogIG1hcHZpZXcoRmVtYWxlLk1DUCwgbGVnZW5kPUYsIHpjb2wgPSAiaWQiLCBjb2wucmVnaW9ucyA9IGMoInJlZCIpLCBhbHBoYS5yZWdpb25zPTAuMykKYGBgCkZpZ3VyZSAxMyB8IEludGVyYWN0aXZlIG1hcDogSG9tZSBSYW5nZSBvdmVybGFwIGJ5IHNleCBvZiAxMDAlIE1DUHMgYXQgU3RvbmUgQ2FueW9uLiBSZWQgcG9seWdvbnMgcmVwcmVzZW50IGZlbWFsZSBsaXphcmRzLCBhbmQgYmx1ZSByZXByZXNlbnRzIG1hbGUgbGl6YXJkcy4gCgoKCgoKVGhlIFN0b25lIENhbnlvbiBwb3B1bGF0aW9uIHNlZW1zIHRvIGV4aGliaXQgZ3JlYXRlciBmZW1hbGUtZmVtYWxlIG92ZXJsYXAgYXMgd2VsbCBhcyBjb25zaWRlcmFibGUgb3ZlcmxhcCBvZiBtYWxlLWZlbWFsZSBob21lIHJhbmdlcy4gVGhlcmUgYXBwZWFycyB0byBiZSBsaW1pdGVkIG1hbGUtbWFsZSBvdmVybGFwLCB3aXRoIG9jY3VyYW5jZSBoYXBwZW5pbmcgaW4gb25seSB0d28gbWFsZS1tYWxlIGhvbWUgcmFuZ2UgcG9seWdvbnMuIFRoaXMgZmluZGluZyBpcyBpbiBjb250cmFzdCB0byB0aGUgT3dsIEhlYWQgYnV0dGVzIHN0dWR5IHdoaWNoIHJldmVhbGVkIHRoYXQgdGhlcmUgd2FzIGEgbGFyZ2UgZGVncmVlIG9mIG92ZXJsYXAgYW1vbmcgbWFsZS1mZW1hbGUgYW5kIG1hbGUtbWFsZSBvdmVybGFwcyAoVGFibGUgeCkuIEdpbGxhcmRvIGNvbmNsdWRlZCB0aGF0LCBpbiB0aGVpciBzdHVkeSwgdGhlIGhpZ2ggZGVncmVlIG9mIG92ZXJsYXAgaW4gbWFsZXMtbWFsZXMgaW50ZXJhY3Rpb25zIG1heSBiZSBkdWUgdG8gaGF2aW5nIGxhcmdlciBob21lIHJhbmdlcyBmb3IgbWF0ZSBzZWFyY2hpbmcgYWN0aXZpdGllcy4gTWFsZXMgbWF5IGhhdmUgYW5kIGluY3JlYXNlZCBob21lIHJhbmdlIHNpemUgdG8gbWF4aW1pemUgdGhlaXIgYWNjZXNzIHRvIG11bHRpcGxlIGZlbWFsZXMuIFNoZSBjb25jbHVkZWQgdGhhdCB0aGUgbGFjayBvZiBmZW1hbGUtZmVtYWxlIG92ZXJsYXAgbWF5IGJlIGR1ZSB0byBzbWFsbGVyIGhvbWUgcmFuZ2Ugc2l6ZXMuIAoKQXQgU3RvbmUgQ2FueW9uLCBtYWxlcyBoYXZlIHJlZHVjZWQgaG9tZSByYW5nZSBzaXplcyAoVGFibGUgNjsgRmlnLiA0KS4gSG93ZXZlciwgbWFsZXMgc3RpbGwgcmV0YWluIGhvbWUgcmFuZ2Ugb3ZlcmxhcCB3aXRoIG11bHRpcGxlIGZlbWFsZXMgd2hpbGUgaGF2aW5nIHJlZHVjZWQgY29udGFjdCB3aXRoIG90aGVyIG1hbGVzLiBUaGlzIG1heSBiZSBpbiByZXNwb25zZSB0byBudXRyaWVudCBzdWJzaWRpZXMgdGhhdCByZWR1Y2UgdGhlIG5lZWQgdG8gaGF2ZSBleHBhbmRlZCBob21lIHJhbmdlIHNpemVzIGZvciBmb3JhZ2luZyBhY3Rpdml0aWVzIGZvciBib3RoIG1hbGVzIGFuZCBmZW1hbGVzLiBUaGVyZSBtYXkgYWxzbyBiZSBhIGhpZ2hlciBkZW5zaXR5IG9mIGZlbWFsZXMgYXMgYSByZXNwb25zZSB0byByZXNvdXJjZSBhdmFpbGFiaWxpdHkgYW5kIHJlZHVjZWQgcmFuZ2UgcmVxdWlyZW1lbnRzLiBNYWxlcyBhcmUgbm90IGZvcmNlZCB0byBleHBhbmQgaG9tZSByYW5nZXMgZm9yIG1hdGUgc2VhcmNoaW5nIHRvIHRoZSBleHRhbnQgdGhhdCBpbmRpdmlkdWFscyBhdCBPd2wgSGVhZCBCdXR0ZXMgbWF5IGJlIHN1YmplY3QgdG8uIAoKCgpUYWJsZSA4IHwgSG9tZSByYW5nZSBvdmVybGFwIG9mIEdpbGEgTW9uc3RlcnMgYXQgdGhlIG51dHJpZW50IHN1YnNpZGl6ZWQgc2l0ZS4gTWFsZS1tYWxlIG92ZXJsYXBzIG9ubHkgb2NjdXJlZCBiZXR3ZWVuIHR3byBwYWlycyBvZiBtYWxlczogTTE0LU02OSBhbmQgTTExOS1NMjE1IGF0IDAuNSBoYS4gYW5kIDE5LjUgaGEuIHJlc3BlY3RpdmVseSBhbmQgd2VyZSB0aGVyZWZvcmUgbm90IGluY2x1ZGVkIGluIHRoZSB0YWJsZS4gCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PUZBTFNFfQpPTF9UYWJsZTwtcmVhZC5jc3YoIi4vT3ZlcmxhcC9PdmVyTGFwX1RhYmxlLmNzdiIpCgprYWJsZShPTF9UYWJsZSwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnSG9tZSByYW5nZSBvdmVybGFwIG9mIFN0b25lIENhbnlvbiBHaWxhIE1vbnN0ZXJzIHVzaW5nIDEwMCUgTUNQcy4nKQpgYGAKCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CmhyLm92ZXJsYXA8LXJlYWQuY3N2KCIuL092ZXJsYXAvSFJfT3ZlcmxhcF9EYXRhLmNzdiIpCgpoci5vdmVybGFwLmFuYWwgPC0gc3VtbWFyeVNFKGhyLm92ZXJsYXAsIG1lYXN1cmV2YXI9Ik9MIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwdmFycz1jKCJJbnRlcmFjdGlvbiIpLCBuYS5ybSA9IFRSVUUpCgojIFNFQVNfR1JQX01lYW5zCmthYmxlKGhyLm92ZXJsYXAuYW5hbCwgZm9ybWF0ID0gInBhbmRvYyIsIGNhcHRpb24gPSAnSG9tZSBSYW5nZSBPdmVybGFwIFN1bW1hcnknKQpgYGAKCgoKCiMgSG9tZSBSYW5nZSBPdmVybGFwIChLREUpCgoKYGBge3IgZWNobz1GQUxTRSwgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRSwgcGFnZWQucHJpbnQ9RkFMU0V9CgprZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uIDwtIGZ1bmN0aW9uKGZpbGVuYW1lLCBwZXJjZW50YWdlKXsKICBkYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSBmaWxlbmFtZSxzdHJpbmdzQXNGYWN0b3JzID0gRkFMU0UpCiAgZGF0YS5zcCA8LSBkYXRhWywgYygiTElaQVJETlVNQkVSIiwgIkVBU1RJTkciLCAiTk9SVEhJTkciKV0KICBjb29yZGluYXRlcyhkYXRhLnNwKSA8LSBjKCJFQVNUSU5HIiwgIk5PUlRISU5HIikKICBwcm9qNHN0cmluZyhkYXRhLnNwKSA8LSBDUlMuU0MKICBrZGU8LWtlcm5lbFVEKGRhdGEuc3AsIGg9ImhyZWYiLCBrZXJuPSJiaXZub3JtIiwgZ3JpZD0xMDAwKQogIHZlciA8LSBnZXR2ZXJ0aWNlc2hyKGtkZSwgcGVyY2VudGFnZSkKICB2ZXJAcHJvajRzdHJpbmc8LUNSUy5TQwogIHZlcgp9CgpNNjdfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL002Ny9NNjcgLmNzdicsIHBlcmNlbnRhZ2U9IDk1KQpNNjlfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL002OS9NNjkgLmNzdicsIHBlcmNlbnRhZ2U9IDk1KQpNMjU1X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NMjU1L00yNTUgLmNzdicsIHBlcmNlbnRhZ2U9IDk1KQpNMjE1X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NMjE1L00yMTUgLmNzdicsIHBlcmNlbnRhZ2U9IDk1KQpNMTRfS0RFPC1rZGVfYW5hbHlzaXMuaHJlZi5wb2x5Z29uKCcuL00xNC9NMTQgLmNzdicsIHBlcmNlbnRhZ2U9IDk1KQpNMTE5X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NMTE5L00xMTkgLmNzdicsIHBlcmNlbnRhZ2U9IDk1KQpNMTEyX0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9NMTEyL00xMTIgLmNzdicsIHBlcmNlbnRhZ2U9IDk1KQoKRjY2X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9GNjYvRjY2IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjM2X0tERTwta2RlX2FuYWx5c2lzLmhyZWYucG9seWdvbignLi9GMzYvRjM2IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjI1Ml9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjI1Mi9GMjUyIC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjIxNF9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjIxNC9GMjE0IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjIwMF9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjIwMC9GMjAwIC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjE0N19LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjE0Ny9GMTQ3IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjE0Nl9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjE0Ni9GMTQ2IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjEzN19LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjEzNy9GMTM3IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjEzNV9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjEzNS9GMTM1IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjExNF9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjExNC9GMTE0IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKRjEwNF9LREU8LWtkZV9hbmFseXNpcy5ocmVmLnBvbHlnb24oJy4vRjEwNC9GMTA0IC5jc3YnLCBwZXJjZW50YWdlPSA5NSkKCk1hbGUuS0RFIDwtIHJiaW5kKE02N19LREUsTTY5X0tERSxNMjU1X0tERSxNMjE1X0tERSxNMTRfS0RFLE0xMTlfS0RFLE0xMTJfS0RFKQpGZW1hbGUuS0RFIDwtIHJiaW5kKEY2Nl9LREUsRjM2X0tERSxGMjUyX0tERSxGMjE0X0tERSxGMjAwX0tERSxGMTQ3X0tERSxGMTQ2X0tERSxGMTM3X0tERSwKICAgICAgICAgICAgICAgICAgICBGMTM1X0tERSxGMTE0X0tERSxGMTA0X0tERSkKCm1hcHZpZXdPcHRpb25zKGJhc2VtYXBzID0gYygiT3BlblN0cmVldE1hcCIsIkVzcmkuV29ybGRJbWFnZXJ5IiwiT3BlblRvcG9NYXAiKSwKICAgICAgICAgICAgICAgbmEuY29sb3IgPSAibWFnZW50YSIsCiAgICAgICAgICAgICAgIGxheWVycy5jb250cm9sLnBvcyA9ICJ0b3BsZWZ0IikKCm1hcHZpZXcoTWFsZS5LREUsIGxlZ2VuZD1GLCB6Y29sPSJpZCIsIGNvbC5yZWdpb25zID0gYygiYmx1ZSIpLCBhbHBoYS5yZWdpb25zPTAuMykgKyAKICBtYXB2aWV3KEZlbWFsZS5LREUsIGxlZ2VuZD1GLCB6Y29sID0gImlkIiwgY29sLnJlZ2lvbnMgPSBjKCJyZWQiKSwgYWxwaGEucmVnaW9ucz0wLjMpCmBgYApGaWd1cmUgMTQgfCBJbnRlcmFjdGl2ZSBtYXA6IEhvbWUgUmFuZ2Ugb3ZlcmxhcCBieSBzZXggb2YgOTUlIEtERXMgYXQgU3RvbmUgQ2FueW9uLiBSZWQgcG9seWdvbnMgcmVwcmVzZW50IGZlbWFsZSBsaXphcmRzLCBhbmQgYmx1ZSByZXByZXNlbnRzIG1hbGUgbGl6YXJkcy4gCgoKCgoKCmBgYHtyIGVjaG89RkFMU0UsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIHBhZ2VkLnByaW50PVRSVUV9CgojIGtkZV9hbmFseXNpcy5ocmVmLnJhc3RlciA8LSBmdW5jdGlvbihmaWxlbmFtZSl7CiMgICBkYXRhIDwtIHJlYWQuY3N2KGZpbGUgPSBmaWxlbmFtZSkKIyAgIHggPC0gYXMuZGF0YS5mcmFtZShkYXRhJEVBU1RJTkcpCiMgICB5IDwtIGFzLmRhdGEuZnJhbWUoZGF0YSROT1JUSElORykKIyAgIHh5IDwtIGMoeCx5KQojICAgZGF0YS5wcm9qIDwtIFNwYXRpYWxQb2ludHNEYXRhRnJhbWUoeHksZGF0YSwgcHJvajRzdHJpbmcgPSBDUlMuU0MpCiMgICB4eSA8LSBTcGF0aWFsUG9pbnRzKGRhdGEucHJvakBjb29yZHMpCiMgICBrZGU8LWtlcm5lbFVEKHh5LCBoPSJocmVmIiwga2Vybj0iYml2bm9ybSIsIGdyaWQ9MTAwMCkKIyAgIGtkZUBwcm9qNHN0cmluZzwtIENSUy5TQwojICAga2RlCiMgfQoKTTExMi5yYXN0ZXIub3V0cHV0PC1rZGVfYW5hbHlzaXMuaHJlZi5yYXN0ZXIoIi4vTTExMi9NMTEyIC5jc3YiKQpGMTE0LnJhc3Rlci5vdXRwdXQ8LWtkZV9hbmFseXNpcy5ocmVmLnJhc3RlcigiLi9GMTE0L0YxMTQgLmNzdiIpCkYyMDAucmFzdGVyLm91dHB1dDwta2RlX2FuYWx5c2lzLmhyZWYucmFzdGVyKCIuL0YyMDAvRjIwMCAuY3N2IikKIyBwbG90KE0xMTIucmFzdGVyLm91dHB1dCkKIyBtYXB2aWV3KE0xMTIucmFzdGVyLm91dHB1dCwgYWxwaGEucmVnaW9ucz0wLjgpCgpNMTEyLnJhc3RlcjwtcmFzdGVyKE0xMTIucmFzdGVyLm91dHB1dCkKRjExNC5yYXN0ZXI8LXJhc3RlcihGMTE0LnJhc3Rlci5vdXRwdXQpCkYyMDAucmFzdGVyPC1yYXN0ZXIoRjIwMC5yYXN0ZXIub3V0cHV0KQoKCmxpYnJhcnkodG1hcCkKIyBjcmVhdGVzIGEgYm91bmRpbmcgYm94IGJhc2VkIG9uIHRoZSBleHRlbnRzIG9mIHRoZSBwb2x5Z29uCiNib3VuZGluZ19ib3ggPC0gYmIoT3V0cHV0LkFyZWFzKQpNMTEyLmJiIDwtIE0xMTJfS0RFQGJib3gKRjExNC5iYiA8LSBGMTE0X0tERUBiYm94CkYyMDAuYmIgPC0gRjIwMF9LREVAYmJveAoKCiMgbWFwcyB0aGUgcmFzdGVyIHdpdGhpbiB0aGUgYm91bmRpbmcgYm94CiMgdG1fc2hhcGUoTTExMi5yYXN0ZXIsIGJib3ggPSBNMTEyLmJiKSArIHRtX3Jhc3RlcigidWQiKQoKIyBtYXNrIHRoZSByYXN0ZXIgYnkgdGhlIG91dHB1dCBhcmVhIHBvbHlnb24KTTExMi5tYXNrZWQgPC0gbWFzayhNMTEyLnJhc3RlciwgTTExMl9LREUpCiMgTTExMi5tYXNrZWRbaXMubmEoTTExMi5tYXNrZWQpXSA8LSAwCkYxMTQubWFza2VkIDwtIG1hc2soRjExNC5yYXN0ZXIsIEYxMTRfS0RFKQojIEYxMTQubWFza2VkW2lzLm5hKEYxMTQubWFza2VkKV0gPC0gMApGMjAwLm1hc2tlZCA8LSBtYXNrKEYyMDAucmFzdGVyLCBGMjAwX0tERSkKIyBGMjAwLm1hc2tlZFtpcy5uYShGMjAwLm1hc2tlZCldIDwtIDAKCnBsb3QoTTExMi5tYXNrZWQpCiMgbWFwdmlldyhNMTEyLm1hc2tlZCwgYWxwaGEucmVnaW9ucz0wLjYpCgp0bV9sYXlvdXQobWFpbi50aXRsZT0iTTExMiBGMTE0IGFuZCBGMjAwIEtERSBPdmVybGFwIikrdG1fc2hhcGUoTTExMi5tYXNrZWQpICsKICB0bV9yYXN0ZXIoInVkIiwgc3R5bGUgPSAicXVhbnRpbGUiLCBuID0gMTAwLCBsZWdlbmQuc2hvdyA9IEZBTFNFLCBwYWxldHRlID0gIi1ZbEduQnUiKSArCiAgdG1fc2hhcGUoRjExNC5tYXNrZWQpICsgCiAgdG1fcmFzdGVyKCJ1ZCIsIHN0eWxlID0gInF1YW50aWxlIiwgbiA9IDEwMCwgbGVnZW5kLnNob3cgPSBGQUxTRSwgcGFsZXR0ZSA9ICItWWxHbkJ1IikgKwogIHRtX3NoYXBlKEYyMDAubWFza2VkKSArCiAgdG1fcmFzdGVyKCJ1ZCIsIHN0eWxlID0gInF1YW50aWxlIiwgbiA9IDEwMCwgbGVnZW5kLnNob3cgPSBGQUxTRSwgcGFsZXR0ZSA9ICItWWxHbkJ1IikgKwogIHRtX3NoYXBlKE0xMTJfS0RFKSArIAogIHRtX2JvcmRlcnMoYWxwaGE9LjMsIGNvbCA9ICJibGFjayIpICsgCiAgdG1fc2hhcGUoRjExNF9LREUpICsgCiAgdG1fYm9yZGVycyhhbHBoYT0uMywgY29sID0gImJsYWNrIikgKyAKICB0bV9zaGFwZShGMjAwX0tERSkgKyAKICB0bV9ib3JkZXJzKGFscGhhPS4zLCBjb2wgPSAiYmxhY2siKSArCiAgdG1fbGF5b3V0KGZyYW1lID0gRkFMU0UpCiAgCiMgLCBiYm94ID0gTTExMi5iYgojIGNvbXB1dGUgaG9tZXJhbmdlcyBmb3IgNTAlLCA5NSUgb2YgcG9pbnRzLCBvYmplY3RzIGFyZSByZXR1cm5lZCBhcyBzcGF0aWFsIHBvbHlnb24gZGF0YSBmcmFtZXMKTTExMi5yYW5nZTk1IDwtIGdldHZlcnRpY2VzaHIoTTExMi5yYXN0ZXIub3V0cHV0LCBwZXJjZW50ID0gOTUpCk0xMTIucmFuZ2U1MCA8LSBnZXR2ZXJ0aWNlc2hyKE0xMTIucmFzdGVyLm91dHB1dCwgcGVyY2VudCA9IDUwKQpGMTE0LnJhbmdlOTUgPC0gZ2V0dmVydGljZXNocihGMTE0LnJhc3Rlci5vdXRwdXQsIHBlcmNlbnQgPSA5NSkKRjExNC5yYW5nZTUwIDwtIGdldHZlcnRpY2VzaHIoRjExNC5yYXN0ZXIub3V0cHV0LCBwZXJjZW50ID0gNTApCkYyMDAucmFuZ2U5NSA8LSBnZXR2ZXJ0aWNlc2hyKEYyMDAucmFzdGVyLm91dHB1dCwgcGVyY2VudCA9IDk1KQpGMjAwLnJhbmdlNTAgPC0gZ2V0dmVydGljZXNocihGMjAwLnJhc3Rlci5vdXRwdXQsIHBlcmNlbnQgPSA1MCkKCnRtX2xheW91dChtYWluLnRpdGxlPSJNMTEyIEYxMTQgYW5kIEYyMDAgS0RFIE92ZXJsYXAiKSsKdG1fc2hhcGUoTTExMi5yYW5nZTk1KSArIAogIHRtX2JvcmRlcnMoYWxwaGE9LjcsIGNvbCA9ICIjZmI2YTRhIiwgbHdkID0gMikgKyB0bV9maWxsKGFscGhhPS4xLCBjb2wgPSAiI2ZiNmE0YSIpICsKdG1fc2hhcGUoTTExMi5yYW5nZTUwKSArIHRtX2JvcmRlcnMoYWxwaGE9LjcsIGNvbCA9ICIjZGUyZDI2IiwgbHdkID0gMikgKyB0bV9maWxsKGFscGhhPS4xLCBjb2wgPSAiI2RlMmQyNiIpICsKdG1fbGF5b3V0KGZyYW1lID0gRkFMU0UpICsKdG1fc2hhcGUoRjExNC5yYW5nZTk1KSArIHRtX2JvcmRlcnMoYWxwaGE9LjcsIGNvbCA9ICIjZmI2YTRhIiwgbHdkID0gMikgKyB0bV9maWxsKGFscGhhPS4xLCBjb2wgPSAiI2ZiNmE0YSIpICsKdG1fc2hhcGUoRjExNC5yYW5nZTUwKSArIHRtX2JvcmRlcnMoYWxwaGE9LjcsIGNvbCA9ICIjZGUyZDI2IiwgbHdkID0gMikgKyB0bV9maWxsKGFscGhhPS4xLCBjb2wgPSAiI2RlMmQyNiIpICsKdG1fbGF5b3V0KGZyYW1lID0gRkFMU0UpICsgCnRtX3NoYXBlKEYyMDAucmFuZ2U5NSkgKyB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2ZiNmE0YSIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNmYjZhNGEiKSArCnRtX3NoYXBlKEYyMDAucmFuZ2U1MCkgKyB0bV9ib3JkZXJzKGFscGhhPS43LCBjb2wgPSAiI2RlMmQyNiIsIGx3ZCA9IDIpICsgdG1fZmlsbChhbHBoYT0uMSwgY29sID0gIiNkZTJkMjYiKSArCnRtX2xheW91dChmcmFtZSA9IEZBTFNFKQoKIyMgd3JpdGUgcmFzdGVyIGZpbGVzIHRvIGNvbXB1dGVyOiAKIyB3cml0ZVJhc3RlcihtYXNrZWRfa2RlLCBmaWxlbmFtZSA9ICJrZXJuZWxfZGVuc2l0eS50aWYiKQpgYGAKCgoKCg==